diff --git a/neo/SConstruct b/neo/SConstruct index bc1ee17..d470943 100644 --- a/neo/SConstruct +++ b/neo/SConstruct @@ -13,9 +13,9 @@ conf_filename='site.conf' # choose configuration variables which should be saved between runs # ( we handle all those as strings ) serialized=['CC', 'CXX', 'JOBS', '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', 'SILENT' ] + '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', 'SILENT' ] # global build mode ------------------------------ @@ -36,97 +36,97 @@ erase """ + conf_filename + """ to start with default settings again CC (default gcc) CXX (default g++) - Specify C and C++ compilers (defaults gcc and g++) - ex: CC="gcc-3.3" - You can use ccache and distcc, for instance: - CC="ccache distcc gcc" CXX="ccache distcc g++" + Specify C and C++ compilers (defaults gcc and g++) + ex: CC="gcc-3.3" + You can use ccache and distcc, for instance: + CC="ccache distcc gcc" CXX="ccache distcc g++" JOBS (default 1) - Parallel build + Parallel build BUILD (default debug) - Use debug-all/debug/release to select build settings - ex: BUILD="release" - debug-all: no optimisations, debugging symbols - debug: -O -g - release: all optimisations, including CPU target etc. + Use debug-all/debug/release to select build settings + ex: BUILD="release" + debug-all: no optimisations, debugging symbols + debug: -O -g + release: all optimisations, including CPU target etc. BUILD_ROOT (default 'build') - change the build root directory + change the build root directory TARGET_GAME (default 1) - Build the base game code + Build the base game code TARGET_D3XP (default 1) - Build the d3xp game code + Build the d3xp game code BUILD_GAMEPAK (default 0) - Build a game pak + Build a game pak BASEFLAGS (default '') - Add compile flags + Add compile flags NOCONF (default 0, not saved) - ignore site configuration and use defaults + command line only - + ignore site configuration and use defaults + command line only + SILENT ( default 0, saved ) - hide the compiler output, unless error + hide the compiler output, unless error """ if ( not g_sdk ): - help_string += """ + help_string += """ DEDICATED (default 0) - Control regular / dedicated type of build: - 0 - client - 1 - dedicated server - 2 - both + Control regular / dedicated type of build: + 0 - client + 1 - dedicated server + 2 - both TARGET_CORE (default 1) - Build the core + Build the core TARGET_MONO (default 0) - Build a monolithic binary + Build a monolithic binary TARGET_DEMO (default 0) - Build demo client ( both a core and game, no mono ) - NOTE: if you *only* want the demo client, set TARGET_CORE and TARGET_GAME to 0 + Build demo client ( both a core and game, no mono ) + NOTE: if you *only* want the demo client, set TARGET_CORE and TARGET_GAME to 0 IDNET_HOST (default to source hardcoded) - Override builtin IDNET_HOST with your own settings - + Override builtin IDNET_HOST with your own settings + GL_HARDLINK (default 0) - Instead of dynamically loading the OpenGL libraries, use implicit dependencies - NOTE: no GL logging capability and no r_glDriver with GL_HARDLINK 1 + Instead of dynamically loading the OpenGL libraries, use implicit dependencies + NOTE: no GL logging capability and no r_glDriver with GL_HARDLINK 1 DEBUG_MEMORY (default 0) - Enables memory logging to file - + Enables memory logging to file + LIBC_MALLOC (default 1) - Toggle idHeap memory / libc malloc usage - When libc malloc is on, memory size statistics are wrong ( no _msize ) + Toggle idHeap memory / libc malloc usage + When libc malloc is on, memory size statistics are wrong ( no _msize ) ID_NOLANADDRESS (default 0) - Don't recognize any IP as LAN address. This is useful when debugging network - code where LAN / not LAN influences application behaviour - + Don't recognize any IP as LAN address. This is useful when debugging network + code where LAN / not LAN influences application behaviour + ID_MCHECK (default 2) - Perform heap consistency checking - 0: on in Debug / off in Release - 1 forces on, 2 forces off - note that Doom has it's own block allocator/checking - this should not be considered a replacement, but an additional tool + Perform heap consistency checking + 0: on in Debug / off in Release + 1 forces on, 2 forces off + note that Doom has it's own block allocator/checking + this should not be considered a replacement, but an additional tool ALSA (default 1) - enable ALSA sound backend support - + enable ALSA sound backend support + SETUP (default 0, not saved) build a setup. implies release build SDK (default 0, not saved) - build an SDK release + build an SDK release NOCURL (default 0) - set to 1 to disable usage of libcurl and http/ftp downloads feature + set to 1 to disable usage of libcurl and http/ftp downloads feature """ Help( help_string ) @@ -145,100 +145,129 @@ EnsureSConsVersion( 0, 96 ) cpu = commands.getoutput('uname -m') exp = re.compile('.*i?86.*') if exp.match(cpu): - cpu = 'x86' + cpu = 'x86' else: - cpu = commands.getoutput('uname -p') - if ( cpu == 'powerpc' ): - cpu = 'ppc' - else: - cpu = 'cpu' -g_os = 'Linux' + cpu = commands.getoutput('uname -p') + if ( cpu == 'powerpc' ): + cpu = 'ppc' + else: + cpu = 'cpu' +g_os = commands.getoutput('uname') # end system detection --------------------------- # default settings ------------------------------- - -CC = 'gcc' -CXX = 'g++' -JOBS = '1' -BUILD = 'debug' -DEDICATED = '0' -TARGET_CORE = '1' -TARGET_GAME = '1' -TARGET_D3XP = '1' -TARGET_MONO = '0' -TARGET_DEMO = '0' -IDNET_HOST = '' -GL_HARDLINK = '0' -DEBUG_MEMORY = '0' -LIBC_MALLOC = '1' -ID_NOLANADDRESS = '0' -ID_MCHECK = '2' -BUILD_ROOT = 'build' -ALSA = '1' -SETUP = '0' -SDK = '0' -NOCONF = '0' -NOCURL = '0' -BUILD_GAMEPAK = '0' -BASEFLAGS = '' -SILENT = '0' +if (g_os == 'Linux'): + CC = 'gcc' + CXX = 'g++' + JOBS = '1' + BUILD = 'debug' + DEDICATED = '0' + TARGET_CORE = '1' + TARGET_GAME = '1' + TARGET_D3XP = '1' + TARGET_MONO = '0' + TARGET_DEMO = '0' + IDNET_HOST = '' + GL_HARDLINK = '0' + DEBUG_MEMORY = '0' + LIBC_MALLOC = '1' + ID_NOLANADDRESS = '0' + ID_MCHECK = '2' + BUILD_ROOT = 'build' + ALSA = '1' + SETUP = '0' + SDK = '0' + NOCONF = '0' + NOCURL = '0' + BUILD_GAMEPAK = '0' + BASEFLAGS = '' + SILENT = '0' + M4 = 'm4' + +if (g_os == 'FreeBSD'): + CC = 'gcc46' + CXX = 'g++46' + JOBS = '1' + BUILD = 'debug' + DEDICATED = '0' + TARGET_CORE = '1' + TARGET_GAME = '1' + TARGET_D3XP = '1' + TARGET_MONO = '0' + TARGET_DEMO = '0' + IDNET_HOST = '' + GL_HARDLINK = '0' + DEBUG_MEMORY = '0' + LIBC_MALLOC = '1' + ID_NOLANADDRESS = '0' + ID_MCHECK = '2' + BUILD_ROOT = 'build' + ALSA = '0' + SETUP = '0' + SDK = '0' + NOCONF = '0' + NOCURL = '0' + BUILD_GAMEPAK = '0' + BASEFLAGS = '' + SILENT = '0' + M4 = 'gm4' # end default settings --------------------------- # site settings ---------------------------------- if ( not ARGUMENTS.has_key( 'NOCONF' ) or ARGUMENTS['NOCONF'] != '1' ): - site_dict = {} - if (os.path.exists(conf_filename)): - site_file = open(conf_filename, 'r') - p = pickle.Unpickler(site_file) - site_dict = p.load() - print 'Loading build configuration from ' + conf_filename + ':' - for k, v in site_dict.items(): - exec_cmd = k + '=\'' + v + '\'' - print ' ' + exec_cmd - exec(exec_cmd) + site_dict = {} + if (os.path.exists(conf_filename)): + site_file = open(conf_filename, 'r') + p = pickle.Unpickler(site_file) + site_dict = p.load() + print 'Loading build configuration from ' + conf_filename + ':' + for k, v in site_dict.items(): + exec_cmd = k + '=\'' + v + '\'' + print ' ' + exec_cmd + exec(exec_cmd) else: - print 'Site settings ignored' + print 'Site settings ignored' # end site settings ------------------------------ # command line settings -------------------------- for k in ARGUMENTS.keys(): - exec_cmd = k + '=\'' + ARGUMENTS[k] + '\'' - print 'Command line: ' + exec_cmd - exec( exec_cmd ) + exec_cmd = k + '=\'' + ARGUMENTS[k] + '\'' + print 'Command line: ' + exec_cmd + exec( exec_cmd ) # end command line settings ---------------------- # save site configuration ---------------------- if ( not ARGUMENTS.has_key( 'NOCONF' ) or ARGUMENTS['NOCONF'] != '1' ): - for k in serialized: - exec_cmd = 'site_dict[\'' + k + '\'] = ' + k - exec(exec_cmd) + for k in serialized: + exec_cmd = 'site_dict[\'' + k + '\'] = ' + k + exec(exec_cmd) - site_file = open(conf_filename, 'w') - p = pickle.Pickler(site_file) - p.dump(site_dict) - site_file.close() + site_file = open(conf_filename, 'w') + p = pickle.Pickler(site_file) + p.dump(site_dict) + site_file.close() # end save site configuration ------------------ # configuration rules -------------------------- if ( SETUP != '0' ): - DEDICATED = '2' - BUILD = 'release' + DEDICATED = '2' + BUILD = 'release' if ( g_sdk or SDK != '0' ): - TARGET_CORE = '0' - TARGET_GAME = '1' - TARGET_D3XP = '1' - TARGET_MONO = '0' - TARGET_DEMO = '0' + TARGET_CORE = '0' + TARGET_GAME = '1' + TARGET_D3XP = '1' + TARGET_MONO = '0' + TARGET_DEMO = '0' # end configuration rules ---------------------- @@ -249,13 +278,13 @@ g_build = BUILD_ROOT + '/' + BUILD SConsignFile( 'scons.signatures' ) if ( GL_HARDLINK != '0' ): - g_build += '-hardlink' + g_build += '-hardlink' if ( DEBUG_MEMORY != '0' ): - g_build += '-debugmem' - + g_build += '-debugmem' + if ( LIBC_MALLOC != '1' ): - g_build += '-nolibcmalloc' + g_build += '-nolibcmalloc' SetOption('num_jobs', JOBS) @@ -288,58 +317,61 @@ CORECPPFLAGS.append( '-DXTHREADS' ) BASECPPFLAGS.append( '-fmessage-length=0' ) # gcc 4.0 BASECPPFLAGS.append( '-fpermissive' ) +# FreeBSD include path +if (g_os == 'FreeBSD' ): + BASECPPFLAGS.append( '-I/usr/local/include' ) 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' ) + # 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' ) + BASECPPFLAGS.append( '-D_D3SDK' ) if ( BUILD == 'debug-all' ): - OPTCPPFLAGS = [ '-g', '-D_DEBUG' ] - if ( ID_MCHECK == '0' ): - ID_MCHECK = '1' + OPTCPPFLAGS = [ '-g', '-D_DEBUG' ] + if ( ID_MCHECK == '0' ): + ID_MCHECK = '1' elif ( BUILD == 'debug' ): - OPTCPPFLAGS = [ '-g', '-O1', '-D_DEBUG' ] - if ( ID_MCHECK == '0' ): - ID_MCHECK = '1' + OPTCPPFLAGS = [ '-g', '-O1', '-D_DEBUG' ] + if ( ID_MCHECK == '0' ): + ID_MCHECK = '1' elif ( BUILD == 'release' ): - # -fomit-frame-pointer: "-O also turns on -fomit-frame-pointer on machines where doing so does not interfere with debugging." - # on x86 have to set it explicitely - # -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' ] - if ( ID_MCHECK == '0' ): - ID_MCHECK = '2' + # -fomit-frame-pointer: "-O also turns on -fomit-frame-pointer on machines where doing so does not interfere with debugging." + # on x86 have to set it explicitely + # -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' ] + if ( ID_MCHECK == '0' ): + ID_MCHECK = '2' else: - print 'Unknown build configuration ' + BUILD - sys.exit(0) + print 'Unknown build configuration ' + BUILD + sys.exit(0) if ( GL_HARDLINK != '0' ): - CORECPPFLAGS.append( '-DID_GL_HARDLINK' ) + CORECPPFLAGS.append( '-DID_GL_HARDLINK' ) if ( DEBUG_MEMORY != '0' ): - BASECPPFLAGS += [ '-DID_DEBUG_MEMORY', '-DID_REDIRECT_NEWDELETE' ] - + BASECPPFLAGS += [ '-DID_DEBUG_MEMORY', '-DID_REDIRECT_NEWDELETE' ] + if ( LIBC_MALLOC != '1' ): - BASECPPFLAGS.append( '-DUSE_LIBC_MALLOC=0' ) + BASECPPFLAGS.append( '-DUSE_LIBC_MALLOC=0' ) if ( len( IDNET_HOST ) ): - CORECPPFLAGS.append( '-DIDNET_HOST=\\"%s\\"' % IDNET_HOST) + CORECPPFLAGS.append( '-DIDNET_HOST=\\"%s\\"' % IDNET_HOST) if ( ID_NOLANADDRESS != '0' ): - CORECPPFLAGS.append( '-DID_NOLANADDRESS' ) - + CORECPPFLAGS.append( '-DID_NOLANADDRESS' ) + if ( ID_MCHECK == '1' ): - BASECPPFLAGS.append( '-DID_MCHECK' ) - + BASECPPFLAGS.append( '-DID_MCHECK' ) + # create the build environements -g_base_env = Environment( ENV = os.environ, CC = CC, CXX = CXX, LINK = LINK, CPPFLAGS = BASECPPFLAGS, LINKFLAGS = BASELINKFLAGS, CPPPATH = CORECPPPATH, LIBPATH = CORELIBPATH ) +g_base_env = Environment( ENV = os.environ, CC = CC, CXX = CXX, LINK = LINK, CPPFLAGS = BASECPPFLAGS, LINKFLAGS = BASELINKFLAGS, CPPPATH = CORECPPPATH, LIBPATH = CORELIBPATH, M4 = M4 ) scons_utils.SetupUtils( g_base_env ) g_env = g_base_env.Clone() @@ -361,12 +393,12 @@ g_env_noopt.Append( CPPFLAGS = '-fno-strict-aliasing' ) g_game_env.Append( CPPFLAGS = '-fno-strict-aliasing' ) if ( int(JOBS) > 1 ): - print 'Using buffered process output' - silent = False - if ( SILENT == '1' ): - silent = True - scons_utils.SetupBufferedOutput( g_env, silent ) - scons_utils.SetupBufferedOutput( g_game_env, silent ) + print 'Using buffered process output' + silent = False + if ( SILENT == '1' ): + silent = True + scons_utils.SetupBufferedOutput( g_env, silent ) + scons_utils.SetupBufferedOutput( g_game_env, silent ) # mark the globals @@ -402,138 +434,138 @@ game_demo = None # build curl if needed if ( NOCURL == '0' and ( TARGET_CORE == '1' or TARGET_MONO == '1' ) ): - # 1: debug, 2: release - if ( BUILD == 'release' ): - local_curl = 2 - else: - local_curl = 1 - Export( 'GLOBALS ' + GLOBALS ) - curl_lib = SConscript( 'sys/scons/SConscript.curl' ) + # 1: debug, 2: release + if ( BUILD == 'release' ): + local_curl = 2 + else: + local_curl = 1 + Export( 'GLOBALS ' + GLOBALS ) + curl_lib = SConscript( 'sys/scons/SConscript.curl' ) if ( TARGET_CORE == '1' ): - local_gamedll = 1 - local_demo = 0 - local_idlibpic = 0 - if ( DEDICATED == '0' or DEDICATED == '2' ): - 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' ) - Export( 'GLOBALS ' + GLOBALS ) # update idlib_objects - doom = SConscript( g_build + '/core/sys/scons/SConscript.core' ) - - InstallAs( '#doom.' + cpu, doom ) - - if ( DEDICATED == '1' or DEDICATED == '2' ): - local_dedicated = 1 - Export( 'GLOBALS ' + GLOBALS ) - - VariantDir( g_build + '/dedicated/glimp', '.', duplicate = 1 ) - SConscript( g_build + '/dedicated/glimp/sys/scons/SConscript.gl' ) - VariantDir( g_build + '/dedicated', '.', duplicate = 0 ) - 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 ) + local_gamedll = 1 + local_demo = 0 + local_idlibpic = 0 + if ( DEDICATED == '0' or DEDICATED == '2' ): + 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' ) + Export( 'GLOBALS ' + GLOBALS ) # update idlib_objects + doom = SConscript( g_build + '/core/sys/scons/SConscript.core' ) + + InstallAs( '#doom.' + cpu, doom ) + + if ( DEDICATED == '1' or DEDICATED == '2' ): + local_dedicated = 1 + Export( 'GLOBALS ' + GLOBALS ) + + VariantDir( g_build + '/dedicated/glimp', '.', duplicate = 1 ) + SConscript( g_build + '/dedicated/glimp/sys/scons/SConscript.gl' ) + VariantDir( g_build + '/dedicated', '.', duplicate = 0 ) + 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 ) if ( TARGET_GAME == '1' or TARGET_D3XP == '1' ): - local_gamedll = 1 - local_demo = 0 - local_dedicated = 0 - local_idlibpic = 1 - Export( 'GLOBALS ' + GLOBALS ) - dupe = 0 - if ( SDK == '1' ): - # building an SDK, use scons for dependencies walking - # 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' ) - 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 ) - if ( BUILD_GAMEPAK == '1' ): - Command( '#game01-base.pk4', [ game_base, game ], Action( g_env.BuildGamePak ) ) - if ( TARGET_D3XP == '1' ): - # uses idlib as compiled for game/ - local_d3xp = 1 - VariantDir( g_build + '/d3xp', '.', duplicate = dupe ) - Export( 'GLOBALS ' + GLOBALS ) - d3xp = SConscript( g_build + '/d3xp/sys/scons/SConscript.game' ) - game_d3xp = InstallAs( '#game%s-d3xp.so' % cpu, d3xp ) - if ( BUILD_GAMEPAK == '1' ): - Command( '#game01-d3xp.pk4', [ game_d3xp, d3xp ], Action( g_env.BuildGamePak ) ) - + local_gamedll = 1 + local_demo = 0 + local_dedicated = 0 + local_idlibpic = 1 + Export( 'GLOBALS ' + GLOBALS ) + dupe = 0 + if ( SDK == '1' ): + # building an SDK, use scons for dependencies walking + # 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' ) + 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 ) + if ( BUILD_GAMEPAK == '1' ): + Command( '#game01-base.pk4', [ game_base, game ], Action( g_env.BuildGamePak ) ) + if ( TARGET_D3XP == '1' ): + # uses idlib as compiled for game/ + local_d3xp = 1 + VariantDir( g_build + '/d3xp', '.', duplicate = dupe ) + Export( 'GLOBALS ' + GLOBALS ) + d3xp = SConscript( g_build + '/d3xp/sys/scons/SConscript.game' ) + game_d3xp = InstallAs( '#game%s-d3xp.so' % cpu, d3xp ) + if ( BUILD_GAMEPAK == '1' ): + Command( '#game01-d3xp.pk4', [ game_d3xp, d3xp ], Action( g_env.BuildGamePak ) ) + if ( TARGET_MONO == '1' ): - # NOTE: no D3XP atm. add a TARGET_MONO_D3XP - local_gamedll = 0 - local_dedicated = 0 - local_demo = 0 - local_idlibpic = 0 - local_d3xp = 0 - Export( 'GLOBALS ' + GLOBALS ) - VariantDir( g_build + '/mono/glimp', '.', duplicate = 1 ) - SConscript( g_build + '/mono/glimp/sys/scons/SConscript.gl' ) - VariantDir( g_build + '/mono', '.', duplicate = 0 ) - idlib_objects = SConscript( g_build + '/mono/sys/scons/SConscript.idlib' ) - 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 ) + # NOTE: no D3XP atm. add a TARGET_MONO_D3XP + local_gamedll = 0 + local_dedicated = 0 + local_demo = 0 + local_idlibpic = 0 + local_d3xp = 0 + Export( 'GLOBALS ' + GLOBALS ) + VariantDir( g_build + '/mono/glimp', '.', duplicate = 1 ) + SConscript( g_build + '/mono/glimp/sys/scons/SConscript.gl' ) + VariantDir( g_build + '/mono', '.', duplicate = 0 ) + idlib_objects = SConscript( g_build + '/mono/sys/scons/SConscript.idlib' ) + 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 ) if ( TARGET_DEMO == '1' ): - # NOTE: no D3XP atm. add a TARGET_DEMO_D3XP - local_demo = 1 - local_dedicated = 0 - local_gamedll = 1 - local_idlibpic = 0 - local_curl = 0 - local_d3xp = 0 - curl_lib = [] - Export( 'GLOBALS ' + GLOBALS ) - VariantDir( g_build + '/demo/glimp', '.', duplicate = 1 ) - SConscript( g_build + '/demo/glimp/sys/scons/SConscript.gl' ) - VariantDir( g_build + '/demo', '.', duplicate = 0 ) - 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 ) - - local_idlibpic = 1 - Export( 'GLOBALS ' + GLOBALS ) - VariantDir( g_build + '/demo/game', '.', duplicate = 0 ) - 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 ) + # NOTE: no D3XP atm. add a TARGET_DEMO_D3XP + local_demo = 1 + local_dedicated = 0 + local_gamedll = 1 + local_idlibpic = 0 + local_curl = 0 + local_d3xp = 0 + curl_lib = [] + Export( 'GLOBALS ' + GLOBALS ) + VariantDir( g_build + '/demo/glimp', '.', duplicate = 1 ) + SConscript( g_build + '/demo/glimp/sys/scons/SConscript.gl' ) + VariantDir( g_build + '/demo', '.', duplicate = 0 ) + 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 ) + + local_idlibpic = 1 + Export( 'GLOBALS ' + GLOBALS ) + VariantDir( g_build + '/demo/game', '.', duplicate = 0 ) + 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 ) if ( SETUP != '0' ): - brandelf = Program( 'brandelf', 'sys/linux/setup/brandelf.c' ) - if ( TARGET_CORE == '1' and TARGET_GAME == '1' and TARGET_D3XP == '1' ): - setup = Command( 'setup', [ brandelf, doom, doomded, game, d3xp ], Action( g_env.BuildSetup ) ) - else: - print 'Skipping main setup: TARGET_CORE == 0 or TARGET_GAME == 0' - if ( TARGET_DEMO == '1' ): - setup_demo = Command( 'setup-demo', [ brandelf, doom_demo, game_demo ], Action( g_env.BuildSetup ) ) - # if building two setups, make sure JOBS doesn't parallelize them - try: - g_env.Depends( setup_demo, setup ) - except: - pass - else: - print 'Skipping demo setup ( TARGET_DEMO == 0 )' + brandelf = Program( 'brandelf', 'sys/linux/setup/brandelf.c' ) + if ( TARGET_CORE == '1' and TARGET_GAME == '1' and TARGET_D3XP == '1' ): + setup = Command( 'setup', [ brandelf, doom, doomded, game, d3xp ], Action( g_env.BuildSetup ) ) + else: + print 'Skipping main setup: TARGET_CORE == 0 or TARGET_GAME == 0' + if ( TARGET_DEMO == '1' ): + setup_demo = Command( 'setup-demo', [ brandelf, doom_demo, game_demo ], Action( g_env.BuildSetup ) ) + # if building two setups, make sure JOBS doesn't parallelize them + try: + g_env.Depends( setup_demo, setup ) + except: + pass + else: + print 'Skipping demo setup ( TARGET_DEMO == 0 )' if ( SDK != '0' ): - setup_sdk = Command( 'sdk', [ ], Action( g_env.BuildSDK ) ) - g_env.Depends( setup_sdk, [ game, d3xp ] ) + setup_sdk = Command( 'sdk', [ ], Action( g_env.BuildSDK ) ) + g_env.Depends( setup_sdk, [ game, d3xp ] ) # end targets ------------------------------------ diff --git a/neo/d3xp/MultiplayerGame.cpp b/neo/d3xp/MultiplayerGame.cpp index 1105268..73919c2 100644 --- a/neo/d3xp/MultiplayerGame.cpp +++ b/neo/d3xp/MultiplayerGame.cpp @@ -2003,7 +2003,7 @@ void idMultiplayerGame::UpdateMainGui( void ) { mainGui->SetStateString( keyval->GetKey(), keyval->GetValue() ); } mainGui->StateChanged( gameLocal.time ); -#if defined( __linux__ ) +#if defined( __linux__ ) || defined( __FreeBSD__ ) // replacing the oh-so-useful s_reverse with sound backend prompt mainGui->SetStateString( "driver_prompt", "1" ); #else diff --git a/neo/framework/Common.cpp b/neo/framework/Common.cpp index fc102e2..c1c7705 100644 --- a/neo/framework/Common.cpp +++ b/neo/framework/Common.cpp @@ -62,7 +62,7 @@ idCVar com_asyncInput( "com_asyncInput", "0", CVAR_BOOL|CVAR_SYSTEM, "sample inp #define ASYNCSOUND_INFO "0: mix sound inline, 1: memory mapped async mix, 2: callback mixing, 3: write async mix" #if defined( MACOS_X ) idCVar com_asyncSound( "com_asyncSound", "2", CVAR_INTEGER|CVAR_SYSTEM|CVAR_ROM, ASYNCSOUND_INFO ); -#elif defined( __linux__ ) +#elif defined( __linux__ ) || defined( __FreeBSD__ ) idCVar com_asyncSound( "com_asyncSound", "3", CVAR_INTEGER|CVAR_SYSTEM|CVAR_ROM, ASYNCSOUND_INFO ); #else idCVar com_asyncSound( "com_asyncSound", "1", CVAR_INTEGER|CVAR_SYSTEM, ASYNCSOUND_INFO, 0, 1 ); diff --git a/neo/framework/Session_menu.cpp b/neo/framework/Session_menu.cpp index 9c1871e..2781544 100644 --- a/neo/framework/Session_menu.cpp +++ b/neo/framework/Session_menu.cpp @@ -323,7 +323,7 @@ void idSessionLocal::SetMainMenuGuiVars( void ) { guiMsg->SetStateString( "visible_hasxp", fileSystem->HasD3XP() ? "1" : "0" ); -#if defined( __linux__ ) +#if defined( __linux__ ) || defined( __FreeBSD__ ) guiMainMenu->SetStateString( "driver_prompt", "1" ); #else guiMainMenu->SetStateString( "driver_prompt", "0" ); diff --git a/neo/game/MultiplayerGame.cpp b/neo/game/MultiplayerGame.cpp index 439b223..a207ca5 100644 --- a/neo/game/MultiplayerGame.cpp +++ b/neo/game/MultiplayerGame.cpp @@ -1485,7 +1485,7 @@ void idMultiplayerGame::UpdateMainGui( void ) { mainGui->SetStateString( keyval->GetKey(), keyval->GetValue() ); } mainGui->StateChanged( gameLocal.time ); -#if defined( __linux__ ) +#if defined( __linux__ ) || defined( __FreeBSD__ ) // replacing the oh-so-useful s_reverse with sound backend prompt mainGui->SetStateString( "driver_prompt", "1" ); #else diff --git a/neo/idlib/Lib.cpp b/neo/idlib/Lib.cpp index ccb2c98..8aae744 100644 --- a/neo/idlib/Lib.cpp +++ b/neo/idlib/Lib.cpp @@ -152,7 +152,7 @@ dword PackColor( const idVec4 &color ) { dz = ColorFloatToByte( color.z ); dw = ColorFloatToByte( color.w ); -#if defined(_WIN32) || defined(__linux__) || (defined(MACOS_X) && defined(__i386__)) +#if defined(_WIN32) || defined(__linux__) || defined(__FreeBSD__) || (defined(MACOS_X) && defined(__i386__)) return ( dx << 0 ) | ( dy << 8 ) | ( dz << 16 ) | ( dw << 24 ); #elif (defined(MACOS_X) && defined(__ppc__)) return ( dx << 24 ) | ( dy << 16 ) | ( dz << 8 ) | ( dw << 0 ); @@ -167,7 +167,7 @@ UnpackColor ================ */ void UnpackColor( const dword color, idVec4 &unpackedColor ) { -#if defined(_WIN32) || defined(__linux__) || (defined(MACOS_X) && defined(__i386__)) +#if defined(_WIN32) || defined(__linux__) || defined(__FreeBSD__) || (defined(MACOS_X) && defined(__i386__)) unpackedColor.Set( ( ( color >> 0 ) & 255 ) * ( 1.0f / 255.0f ), ( ( color >> 8 ) & 255 ) * ( 1.0f / 255.0f ), ( ( color >> 16 ) & 255 ) * ( 1.0f / 255.0f ), @@ -194,7 +194,7 @@ dword PackColor( const idVec3 &color ) { dy = ColorFloatToByte( color.y ); dz = ColorFloatToByte( color.z ); -#if defined(_WIN32) || defined(__linux__) || (defined(MACOS_X) && defined(__i386__)) +#if defined(_WIN32) || defined(__linux__) || defined(__FreeBSD__) || (defined(MACOS_X) && defined(__i386__)) return ( dx << 0 ) | ( dy << 8 ) | ( dz << 16 ); #elif (defined(MACOS_X) && defined(__ppc__)) return ( dy << 16 ) | ( dz << 8 ) | ( dx << 0 ); @@ -209,7 +209,7 @@ UnpackColor ================ */ void UnpackColor( const dword color, idVec3 &unpackedColor ) { -#if defined(_WIN32) || defined(__linux__) || (defined(MACOS_X) && defined(__i386__)) +#if defined(_WIN32) || defined(__linux__) || defined(__FreeBSD__) || (defined(MACOS_X) && defined(__i386__)) unpackedColor.Set( ( ( color >> 0 ) & 255 ) * ( 1.0f / 255.0f ), ( ( color >> 8 ) & 255 ) * ( 1.0f / 255.0f ), ( ( color >> 16 ) & 255 ) * ( 1.0f / 255.0f ) ); @@ -577,7 +577,7 @@ void AssertFailed( const char *file, int line, const char *expression ) { idLib::sys->DebugPrintf( "\n\nASSERTION FAILED!\n%s(%d): '%s'\n", file, line, expression ); #ifdef _WIN32 __asm int 0x03 -#elif defined( __linux__ ) +#elif defined( __linux__ ) || defined (__FreeBSD__) __asm__ __volatile__ ("int $0x03"); #elif defined( MACOS_X ) kill( getpid(), SIGINT ); diff --git a/neo/idlib/bv/Frustum.cpp b/neo/idlib/bv/Frustum.cpp index 52e76d6..74b2b38 100644 --- a/neo/idlib/bv/Frustum.cpp +++ b/neo/idlib/bv/Frustum.cpp @@ -2044,7 +2044,7 @@ bool idFrustum::ProjectionBounds( const idBounds &bounds, idBounds &projectionBo return ProjectionBounds( idBox( bounds, vec3_origin, mat3_identity ), projectionBounds ); } -#ifndef __linux__ +#if !defined(__linux__) && !defined(__FreeBSD__) /* ============ diff --git a/neo/renderer/qgl.h b/neo/renderer/qgl.h index 2f994af..abebc0b 100644 --- a/neo/renderer/qgl.h +++ b/neo/renderer/qgl.h @@ -51,6 +51,15 @@ If you have questions concerning this license or the applicable additional terms #include #include +#elif defined( __FreeBSD__ ) + +// using our local glext.h +// http://oss.sgi.com/projects/ogl-sample/ABI/ +#define GL_GLEXT_LEGACY +#define GLX_GLXEXT_LEGACY +#include +#include + #else #include @@ -544,7 +553,7 @@ extern BOOL ( WINAPI * qwglSwapLayerBuffers)(HDC, UINT); #endif // _WIN32 -#if defined( __linux__ ) +#if defined( __linux__ ) || defined(__FreeBSD__) //GLX Functions extern XVisualInfo * (*qglXChooseVisual)( Display *dpy, int screen, int *attribList ); diff --git a/neo/sys/gllog/gl_extensions.cpp.m4 b/neo/sys/gllog/gl_extensions.cpp.m4 index aaae369..58bc79d 100644 --- a/neo/sys/gllog/gl_extensions.cpp.m4 +++ b/neo/sys/gllog/gl_extensions.cpp.m4 @@ -46,7 +46,7 @@ GLExtension_t GLimp_ExtensionPointer( const char *name ) { } #endif GLExtension_t ret; - #if defined(__linux__) + #if defined(__linux__) || defined(__FreeBSD__) // for some reason glXGetProcAddressARB doesn't work on RH9? ret = qglXGetProcAddressARB((const GLubyte *) name); if ( !ret ) { diff --git a/neo/sys/linux/sound.cpp b/neo/sys/linux/sound.cpp index e677852..408485d 100644 --- a/neo/sys/linux/sound.cpp +++ b/neo/sys/linux/sound.cpp @@ -29,7 +29,6 @@ If you have questions concerning this license or the applicable additional terms #include #include #include -#include #include #include // OSS sound interface diff --git a/neo/sys/posix/posix_main.cpp b/neo/sys/posix/posix_main.cpp index 566bb81..6c1fe93 100644 --- a/neo/sys/posix/posix_main.cpp +++ b/neo/sys/posix/posix_main.cpp @@ -430,7 +430,7 @@ const char *Sys_DefaultCDPath( void ) { return ""; } -long Sys_FileTimeStamp(FILE * fp) { +ID_TIME_T Sys_FileTimeStamp(FILE * fp) { struct stat st; fstat(fileno(fp), &st); return st.st_mtime; diff --git a/neo/sys/scons/SConscript.core b/neo/sys/scons/SConscript.core index e49b115..c8cf579 100644 --- a/neo/sys/scons/SConscript.core +++ b/neo/sys/scons/SConscript.core @@ -336,7 +336,12 @@ else: sound_env.Append( CPPDEFINES = 'NO_ALSA' ) sound_lib = sound_env.StaticLibrary( 'sound', sound_list ) -local_env.Append( LIBS = [ 'pthread', 'dl' ] ) +# 'dl' is a linuxism +if (g_os == 'Linux'): + local_env.Append( LIBS = [ 'pthread', 'dl' ] ) +else: + local_env.Append( LIBS = [ 'pthread' ] ) + if ( local_dedicated == 0 ): local_env.Append( LIBS = [ 'X11', 'Xext', 'Xxf86vm' ] ) # 'Xxf86dga', local_env.Append( LIBPATH = [ '/usr/X11R6/lib' ] ) diff --git a/neo/sys/scons/SConscript.gl b/neo/sys/scons/SConscript.gl index a7053a1..b45d265 100644 --- a/neo/sys/scons/SConscript.gl +++ b/neo/sys/scons/SConscript.gl @@ -32,7 +32,7 @@ def build_logfuncs(env, target, source): do_logfunc(f_in, f_out) f_in.close() - f_out.write('\n#ifdef __linux__\n\n') + f_out.write('\n#if defined(__linux__) || defined(__FreeBSD__)\n\n') f_in = open( gllog_path + '/glX.api', 'r') do_logfunc(f_in, f_out) f_in.close() diff --git a/neo/sys/scons/scons_utils.py b/neo/sys/scons/scons_utils.py index d8ef922..5c7c277 100644 --- a/neo/sys/scons/scons_utils.py +++ b/neo/sys/scons/scons_utils.py @@ -127,7 +127,9 @@ def checkLDD( target, source, env ): def SharedLibrarySafe( env, target, source ): ret = env.SharedLibrary( target, source ) - env.AddPostAction( ret, checkLDD ) + # FIXME: This is an evil hack + if ( 'Linux' == commands.getoutput('uname')): + env.AddPostAction( ret, checkLDD ) return ret def NotImplementedStub( *whatever ): diff --git a/neo/sys/sys_local.cpp b/neo/sys/sys_local.cpp index bf40527..4391ce5 100644 --- a/neo/sys/sys_local.cpp +++ b/neo/sys/sys_local.cpp @@ -123,7 +123,7 @@ void idSysLocal::DLL_Unload( int dllHandle ) { void idSysLocal::DLL_GetFileName( const char *baseName, char *dllName, int maxLength ) { #ifdef _WIN32 idStr::snPrintf( dllName, maxLength, "%s" CPUSTRING ".dll", baseName ); -#elif defined( __linux__ ) +#elif defined( __linux__ ) || defined( __FreeBSD__ ) idStr::snPrintf( dllName, maxLength, "%s" CPUSTRING ".so", baseName ); #elif defined( MACOS_X ) idStr::snPrintf( dllName, maxLength, "%s" ".dylib", baseName ); diff --git a/neo/sys/sys_public.h b/neo/sys/sys_public.h index 996626b..7708335 100644 --- a/neo/sys/sys_public.h +++ b/neo/sys/sys_public.h @@ -133,6 +133,35 @@ If you have questions concerning this license or the applicable additional terms #endif +// FreeBSD +#ifdef __FreeBSD__ + +#ifdef __i386__ + #define BUILD_STRING "freebsd-x86" + #define BUILD_OS_ID 3 + #define CPUSTRING "x86" + #define CPU_EASYARGS 1 +#endif + +#define _alloca alloca +#define _alloca16( x ) ((void *)((((int)alloca( (x)+15 )) + 15) & ~15)) + +#define ALIGN16( x ) x +#define PACKED __attribute__((packed)) + +#define PATHSEPERATOR_STR "/" +#define PATHSEPERATOR_CHAR '/' + +#define __cdecl +#define ASSERT assert + +#define ID_INLINE inline +#define ID_STATIC_TEMPLATE + +#define assertmem( x, y ) + +#endif + #ifdef __GNUC__ #define id_attribute(x) __attribute__(x) #else