View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0005232 | The Dark Mod | Coding | public | 30.04.2020 14:49 | 02.01.2023 16:10 |
| Reporter | t405 | Assigned To | stgatilov | ||
| Priority | low | Severity | major | Reproducibility | always |
| Status | closed | Resolution | duplicate | ||
| Fixed in Version | TDM 2.10 | ||||
| Summary | 0005232: scons configuration files are not compatible with python3 [patch included] | ||||
| Description | After trying to compile according to the wiki instructions, using scons, a number of errors occurred. Most of these errors were due to the code being written in python2 and being incompatible with python3. The problematic files were SConstruct sys/scons/scons_utils.py tdm_update/SConstruct tdm_update/scons_utils.py | ||||
| Steps To Reproduce | I checked out the svn repo 8693 and attempted to compile using the wiki instructions Immediately got an error: scons: Reading SConscript files ... File "/home/shawn/Code/darkmod-svn-wd/trunk/SConstruct", line 150 print 'Loading build configuration from ' + conf_filename + ':' ^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print('Loading build configuration from ' + conf_filename + ':')? There were a number of other errors: a missing module (popen2) and problems with the pickle and raise syntax. | ||||
| Additional Information | Compilation was successful after I patched the files by translating them with 2to3, cleaning them up with black, and manually fixing the other errors. `uname -a`: Linux 5.6.7-arch1-1 0000001 SMP PREEMPT Thu, 23 Apr 2020 09:13:56 +0000 x86_64 GNU/Linux `scons --version | xargs`: SCons by Steven Knight et al.: script: v3.1.2.__BUILD__, 2019-12-17 02:06:27, by none on none engine: v3.1.2.__BUILD__, 2019-12-17 02:06:27, by none on none engine path: [/usr/lib/python3.8/site-packages/SCons] Copyright (c) 2001 - 2019 The SCons Foundation `black --version`: black, version 19.10b0 Let me know if you need additional information. Patch is included in uploads. | ||||
| Tags | No tags attached. | ||||
| Attached Files | fix-scons-python2-001.patch (43,655 bytes)
diff --git a/SConstruct b/SConstruct
index 14e504ed5..a3e043322 100644
--- a/SConstruct
+++ b/SConstruct
@@ -3,32 +3,50 @@
# TTimo <ttimo@idsoftware.com>
# http://scons.sourceforge.net
-import sys, os, time, commands, re, pickle, StringIO, popen2, commands, pdb, zipfile, string
+import sys, os, time, subprocess, re, pickle, io, subprocess, pdb, zipfile, string
import SCons
-sys.path.append( 'sys/scons' )
+sys.path.append("sys/scons")
import scons_utils
-conf_filename='site.conf'
+conf_filename = "site.conf"
# choose configuration variables which should be saved between runs
# ( we handle all those as strings )
-serialized=['CC', 'CXX', 'JOBS', 'BUILD', 'GL_HARDLINK',
- 'DEBUG_MEMORY', 'LIBC_MALLOC', 'ID_MCHECK', 'NOCURL',
- 'BUILD_ROOT', 'BASEFLAGS', 'SILENT', 'NO_GCH', 'OPENMP',
- 'TARGET_ARCH' ]
+serialized = [
+ "CC",
+ "CXX",
+ "JOBS",
+ "BUILD",
+ "GL_HARDLINK",
+ "DEBUG_MEMORY",
+ "LIBC_MALLOC",
+ "ID_MCHECK",
+ "NOCURL",
+ "BUILD_ROOT",
+ "BASEFLAGS",
+ "SILENT",
+ "NO_GCH",
+ "OPENMP",
+ "TARGET_ARCH",
+]
# ------------------------------------------------
# help -------------------------------------------
-help_string = """
+help_string = (
+ """
Usage: scons [OPTIONS] [TARGET] [CONFIG]
[OPTIONS] and [TARGET] are covered in command line options, use scons -H
[CONFIG]: KEY="VALUE" [...]
-a number of configuration options saved between runs in the """ + conf_filename + """ file
-erase """ + conf_filename + """ to start with default settings again
+a number of configuration options saved between runs in the """
+ + conf_filename
+ + """ file
+erase """
+ + conf_filename
+ + """ to start with default settings again
CC (default gcc)
CXX (default g++)
@@ -90,122 +108,118 @@ ID_MCHECK (default 2)
NOCURL (default 0)
set to 1 to disable usage of libcurl and http/ftp downloads feature
"""
+)
-Help( help_string )
+Help(help_string)
# end help ---------------------------------------
# sanity -----------------------------------------
-EnsureSConsVersion( 0, 96 )
+EnsureSConsVersion(0, 96)
# end sanity -------------------------------------
# system detection -------------------------------
# CPU type
-cpu = commands.getoutput('uname -m')
-exp = re.compile('.*i?86.*')
+cpu = subprocess.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 = subprocess.getoutput("uname -p")
+ if cpu == "powerpc":
+ cpu = "ppc"
+ else:
+ cpu = "cpu"
+g_os = "Linux"
# end system detection ---------------------------
# default settings -------------------------------
-CC = 'gcc'
-CXX = 'g++'
-JOBS = '1'
-BUILD = 'debug'
-GL_HARDLINK = '0'
-DEBUG_MEMORY = '0'
-LIBC_MALLOC = '1'
-ID_MCHECK = '2'
-BUILD_ROOT = 'build'
-NOCONF = '0'
-NOCURL = '0'
-BASEFLAGS = ''
-SILENT = '0'
-NO_GCH = '0'
-OPENMP = '0'
-TARGET_ARCH = 'x86'
+CC = "gcc"
+CXX = "g++"
+JOBS = "1"
+BUILD = "debug"
+GL_HARDLINK = "0"
+DEBUG_MEMORY = "0"
+LIBC_MALLOC = "1"
+ID_MCHECK = "2"
+BUILD_ROOT = "build"
+NOCONF = "0"
+NOCURL = "0"
+BASEFLAGS = ""
+SILENT = "0"
+NO_GCH = "0"
+OPENMP = "0"
+TARGET_ARCH = "x86"
# 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)
+if "NOCONF" not in ARGUMENTS or ARGUMENTS["NOCONF"] != "1":
+ site_dict = {}
+ if os.path.exists(conf_filename):
+ print("Loading build configuration from " + conf_filename + ":")
+ with open(conf_filename, "rb") as handle:
+ site_dict = pickle.load(handle)
+ for k, v in list(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 )
+for k in list(ARGUMENTS.keys()):
+ exec_cmd = k + "='" + ARGUMENTS[k] + "'"
+ print("Command line: " + exec_cmd)
+ exec(exec_cmd)
# stgatilov: avoid annoying human errors when you set target='x32'
# and get surprised that it does not build properly =)
-if TARGET_ARCH == 'x32':
- TARGET_ARCH = 'x86'
+if TARGET_ARCH == "x32":
+ TARGET_ARCH = "x86"
# 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)
-
- site_file = open(conf_filename, 'w')
- p = pickle.Pickler(site_file)
- p.dump(site_dict)
- site_file.close()
+if "NOCONF" not in ARGUMENTS or ARGUMENTS["NOCONF"] != "1":
+ for k in serialized:
+ exec_cmd = "site_dict['" + k + "'] = " + k
+ exec(exec_cmd)
+ with open(conf_filename, "wb") as handle:
+ pickle.dump(site_dict, handle, protocol=pickle.HIGHEST_PROTOCOL)
# end save site configuration ------------------
# general configuration, target selection --------
-g_build = BUILD_ROOT + '/scons_' + TARGET_ARCH + '/' + BUILD
+g_build = BUILD_ROOT + "/scons_" + TARGET_ARCH + "/" + BUILD
-#
+#
# Use an absolute path to a single signature file to avoid a problem
# whereby everything gets rebuilt every time due to the signature file
# not being detected.
-#
-SConsignFile(os.path.join(Dir('#').abspath, 'scons.signatures'))
+#
+SConsignFile(os.path.join(Dir("#").abspath, "scons.signatures"))
-if ( GL_HARDLINK != '0' ):
- g_build += '-hardlink'
+if GL_HARDLINK != "0":
+ g_build += "-hardlink"
-if ( DEBUG_MEMORY != '0' ):
- g_build += '-debugmem'
-
-if ( LIBC_MALLOC != '1' ):
- g_build += '-nolibcmalloc'
+if DEBUG_MEMORY != "0":
+ g_build += "-debugmem"
-SetOption('num_jobs', JOBS)
+if LIBC_MALLOC != "1":
+ g_build += "-nolibcmalloc"
+
+SetOption("num_jobs", JOBS)
LINK = CXX
@@ -214,126 +228,141 @@ LINK = CXX
# BASE + GAME + OPT for game
# _noopt versions of the environements are built without the OPT
-BASECPPFLAGS = [ ]
-CORECPPPATH = [ ]
-CORELIBPATH = [ ]
-CORECPPFLAGS = [ ]
-BASELINKFLAGS = [ ]
-CORELINKFLAGS = [ ]
+BASECPPFLAGS = []
+CORECPPPATH = []
+CORELIBPATH = []
+CORECPPFLAGS = []
+BASELINKFLAGS = []
+CORELINKFLAGS = []
# for release build, further optimisations that may not work on all files
-OPTCPPFLAGS = [ ]
+OPTCPPFLAGS = []
-BASECPPFLAGS.append( BASEFLAGS )
-BASECPPFLAGS.append( '-pipe' )
+BASECPPFLAGS.append(BASEFLAGS)
+BASECPPFLAGS.append("-pipe")
# warn all
-BASECPPFLAGS.append( '-Wall' )
-BASECPPFLAGS.append( '-Wno-unknown-pragmas' ) # MSVC-specific pragmas
-BASECPPFLAGS.append( '-Wno-unused-variable' ) # too many, often happens from commenting out code
-BASECPPFLAGS.append( '-Wno-unused-but-set-variable' ) # useful for debugging, also may remain after commenting stuff
-BASECPPFLAGS.append( '-Wno-sign-compare' ) # very nasty warning in the world of STL and size_t
+BASECPPFLAGS.append("-Wall")
+BASECPPFLAGS.append("-Wno-unknown-pragmas") # MSVC-specific pragmas
+BASECPPFLAGS.append(
+ "-Wno-unused-variable"
+) # too many, often happens from commenting out code
+BASECPPFLAGS.append(
+ "-Wno-unused-but-set-variable"
+) # useful for debugging, also may remain after commenting stuff
+BASECPPFLAGS.append(
+ "-Wno-sign-compare"
+) # very nasty warning in the world of STL and size_t
# this define is necessary to make sure threading support is enabled in X
-CORECPPFLAGS.append( '-DXTHREADS' )
+CORECPPFLAGS.append("-DXTHREADS")
# don't wrap gcc messages
-BASECPPFLAGS.append( '-fmessage-length=0' )
+BASECPPFLAGS.append("-fmessage-length=0")
# C++11 features
-BASECPPFLAGS.append( '-std=c++14' )
+BASECPPFLAGS.append("-std=c++14")
# maintain this dangerous optimization off at all times
-BASECPPFLAGS.append( '-fno-strict-aliasing' )
-
-if ( g_os == 'Linux' ):
- # use old ABI for std::string and std::list (which is not fully compliant with C++11 standard)
- # this allows to run TDM binary on OSes which have old glibcxx (e.g. Ubuntu 14.04 from years 2014-2016)
- BASECPPFLAGS.append( '-D_GLIBCXX_USE_CXX11_ABI=0' )
- # 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 :)
- if ( TARGET_ARCH == 'x86' ):
- BASECPPFLAGS.append( '-m32' )
- BASELINKFLAGS.append( '-m32' )
- BASECPPFLAGS.append( '-msse2' );
- if ( TARGET_ARCH == 'x64' ):
- BASECPPFLAGS.append( '-m64' )
- BASELINKFLAGS.append( '-m64' )
- # current ffmpeg dep was built without -fPIC, so can't use position-independent code generation
- BASELINKFLAGS.append( '-no-pie' )
-
- if ( OPENMP != '0' ):
- # openmp support for changes made to the renderer
- BASECPPFLAGS.append( '-fopenmp' )
- BASELINKFLAGS.append( '-fopenmp' )
-
-if ( BUILD == 'debug-all' ):
- 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'
-elif ( BUILD == 'profile' ):
- # -fprofile-arcs is needed for gcc 3.x and 4.x
- OPTCPPFLAGS = [ '-pg', '-fprofile-arcs', '-ftest-coverage', '-O1', '-D_DEBUG' ]
- BASELINKFLAGS.append( '-pg' );
- BASELINKFLAGS.append( '-fprofile-arcs' );
- if ( ID_MCHECK == '0' ):
- ID_MCHECK = '1'
-elif ( BUILD == 'release' ):
- # -fomit-frame-pointer: not set because if prohibits debugging (which is necessary even on release build)
- # -finline-functions: implicit at -O3
- # -fschedule-insns2: implicit at -O2
- # -fno-unsafe-math-optimizations: that should be on by default really. hit some wonko bugs in physics code because of that
- OPTCPPFLAGS = [ '-g', '-O3', '-ffast-math', '-fno-unsafe-math-optimizations' ]
- if ( ID_MCHECK == '0' ):
- ID_MCHECK = '2'
+BASECPPFLAGS.append("-fno-strict-aliasing")
+
+if g_os == "Linux":
+ # use old ABI for std::string and std::list (which is not fully compliant with C++11 standard)
+ # this allows to run TDM binary on OSes which have old glibcxx (e.g. Ubuntu 14.04 from years 2014-2016)
+ BASECPPFLAGS.append("-D_GLIBCXX_USE_CXX11_ABI=0")
+ # 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 :)
+ if TARGET_ARCH == "x86":
+ BASECPPFLAGS.append("-m32")
+ BASELINKFLAGS.append("-m32")
+ BASECPPFLAGS.append("-msse2")
+ if TARGET_ARCH == "x64":
+ BASECPPFLAGS.append("-m64")
+ BASELINKFLAGS.append("-m64")
+ # current ffmpeg dep was built without -fPIC, so can't use position-independent code generation
+ BASELINKFLAGS.append("-no-pie")
+
+ if OPENMP != "0":
+ # openmp support for changes made to the renderer
+ BASECPPFLAGS.append("-fopenmp")
+ BASELINKFLAGS.append("-fopenmp")
+
+if BUILD == "debug-all":
+ 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"
+elif BUILD == "profile":
+ # -fprofile-arcs is needed for gcc 3.x and 4.x
+ OPTCPPFLAGS = ["-pg", "-fprofile-arcs", "-ftest-coverage", "-O1", "-D_DEBUG"]
+ BASELINKFLAGS.append("-pg")
+ BASELINKFLAGS.append("-fprofile-arcs")
+ if ID_MCHECK == "0":
+ ID_MCHECK = "1"
+elif BUILD == "release":
+ # -fomit-frame-pointer: not set because if prohibits debugging (which is necessary even on release build)
+ # -finline-functions: implicit at -O3
+ # -fschedule-insns2: implicit at -O2
+ # -fno-unsafe-math-optimizations: that should be on by default really. hit some wonko bugs in physics code because of that
+ OPTCPPFLAGS = ["-g", "-O3", "-ffast-math", "-fno-unsafe-math-optimizations"]
+ 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' )
+if GL_HARDLINK != "0":
+ CORECPPFLAGS.append("-DID_GL_HARDLINK")
-if ( DEBUG_MEMORY != '0' ):
- BASECPPFLAGS += [ '-DID_DEBUG_MEMORY', '-DID_REDIRECT_NEWDELETE' ]
-
-if ( LIBC_MALLOC != '1' ):
- BASECPPFLAGS.append( '-DUSE_LIBC_MALLOC=0' )
+if DEBUG_MEMORY != "0":
+ BASECPPFLAGS += ["-DID_DEBUG_MEMORY", "-DID_REDIRECT_NEWDELETE"]
+
+if LIBC_MALLOC != "1":
+ BASECPPFLAGS.append("-DUSE_LIBC_MALLOC=0")
+
+if ID_MCHECK == "1":
+ BASECPPFLAGS.append("-DID_MCHECK")
-if ( ID_MCHECK == '1' ):
- BASECPPFLAGS.append( '-DID_MCHECK' )
-
# create the build environements
-g_env_base = Environment( ENV = os.environ, CC = CC, CXX = CXX, LINK = LINK, CPPFLAGS = BASECPPFLAGS, LINKFLAGS = BASELINKFLAGS, CPPPATH = CORECPPPATH, LIBPATH = CORELIBPATH )
-scons_utils.SetupUtils( g_env_base )
-
-g_env_base.Prepend(CPPPATH=['.'])
-path_template = '#/ThirdParty/artefacts/{0}/include'
-g_env_base.Append(CPPPATH = path_template.format('zlib'))
-g_env_base.Append(CPPPATH = path_template.format('libcurl'))
-g_env_base.Append(CPPPATH = path_template.format('openal'))
-g_env_base.Append(CPPPATH = path_template.format('ogg'))
-g_env_base.Append(CPPPATH = path_template.format('vorbis'))
-g_env_base.Append(CPPPATH = path_template.format('devil'))
-g_env_base.Append(CPPPATH = path_template.format('libjpeg'))
-g_env_base.Append(CPPPATH = path_template.format('ffmpeg'))
-g_env_base.Append(CPPPATH = path_template.format('doctest'))
-g_env_base.Append(CPPPATH = path_template.format('pugixml'))
-g_env_base.Append(CPPPATH = '#/renderer')
-g_env_base.Append(CPPPATH = '#/')
-
-g_env_base['CPPFLAGS'] += OPTCPPFLAGS
-g_env_base['CPPFLAGS'] += CORECPPFLAGS
-g_env_base['LINKFLAGS'] += CORELINKFLAGS
-
-
-#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 )
+g_env_base = Environment(
+ ENV=os.environ,
+ CC=CC,
+ CXX=CXX,
+ LINK=LINK,
+ CPPFLAGS=BASECPPFLAGS,
+ LINKFLAGS=BASELINKFLAGS,
+ CPPPATH=CORECPPPATH,
+ LIBPATH=CORELIBPATH,
+)
+scons_utils.SetupUtils(g_env_base)
+
+g_env_base.Prepend(CPPPATH=["."])
+path_template = "#/ThirdParty/artefacts/{0}/include"
+g_env_base.Append(CPPPATH=path_template.format("zlib"))
+g_env_base.Append(CPPPATH=path_template.format("libcurl"))
+g_env_base.Append(CPPPATH=path_template.format("openal"))
+g_env_base.Append(CPPPATH=path_template.format("ogg"))
+g_env_base.Append(CPPPATH=path_template.format("vorbis"))
+g_env_base.Append(CPPPATH=path_template.format("devil"))
+g_env_base.Append(CPPPATH=path_template.format("libjpeg"))
+g_env_base.Append(CPPPATH=path_template.format("ffmpeg"))
+g_env_base.Append(CPPPATH=path_template.format("doctest"))
+g_env_base.Append(CPPPATH=path_template.format("pugixml"))
+g_env_base.Append(CPPPATH="#/renderer")
+g_env_base.Append(CPPPATH="#/")
+
+g_env_base["CPPFLAGS"] += OPTCPPFLAGS
+g_env_base["CPPFLAGS"] += CORECPPFLAGS
+g_env_base["LINKFLAGS"] += CORELINKFLAGS
+
+
+# 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 )
# mark the globals
@@ -341,50 +370,50 @@ g_env_base['LINKFLAGS'] += CORELINKFLAGS
local_curl = 0
curl_lib = []
-GLOBALS = 'g_env_base g_os ID_MCHECK curl_lib local_curl NO_GCH TARGET_ARCH'
+GLOBALS = "g_env_base g_os ID_MCHECK curl_lib local_curl NO_GCH TARGET_ARCH"
# end general configuration ----------------------
# targets ----------------------------------------
-Export( 'GLOBALS ' + GLOBALS )
+Export("GLOBALS " + GLOBALS)
thedarkmod = None
# insert SVN revision number into header (requires svnversion)
# svnversion must be run from SVN root, otherwise revision information may be incomplete
-os.chdir(Dir('#').abspath)
+os.chdir(Dir("#").abspath)
svnversion_command = r'sed "s/\!SVNVERSION\!/$(svnversion -c)/g" idlib/svnversion_template.h >idlib/svnversion.h'
if os.system(svnversion_command) != 0:
- exit()
+ exit()
print("Inserted SVN revision number into svnversion.h")
# build curl if needed
-if ( NOCURL == '0' ):
- # 1: debug, 2: release
- if ( BUILD == 'release' ):
- local_curl = 2
- else:
- local_curl = 1
- Export( 'GLOBALS ' + GLOBALS )
- if ( TARGET_ARCH == 'x86' ):
- curl_lib = [ '#linux/libcurl/libcurl.a' ] # Use the static one built for TDM
- if ( TARGET_ARCH == 'x64' ):
- curl_lib = [ '#linux/libcurl/lib64/libcurl.a' ]
-
-
-VariantDir( g_build + '/core', '.', duplicate = 0 )
-thedarkmod = SConscript( g_build + '/core/sys/scons/SConscript.darkmod' )
-
-exe_name = 'thedarkmod.' + ('x64' if TARGET_ARCH == 'x64' else cpu)
+if NOCURL == "0":
+ # 1: debug, 2: release
+ if BUILD == "release":
+ local_curl = 2
+ else:
+ local_curl = 1
+ Export("GLOBALS " + GLOBALS)
+ if TARGET_ARCH == "x86":
+ curl_lib = ["#linux/libcurl/libcurl.a"] # Use the static one built for TDM
+ if TARGET_ARCH == "x64":
+ curl_lib = ["#linux/libcurl/lib64/libcurl.a"]
+
+
+VariantDir(g_build + "/core", ".", duplicate=0)
+thedarkmod = SConscript(g_build + "/core/sys/scons/SConscript.darkmod")
+
+exe_name = "thedarkmod." + ("x64" if TARGET_ARCH == "x64" else cpu)
# Note: this target only runs if you append ".." (without quotes) as the last argument to scons command line
# It copies executable into ../darkmod, which is default location of darkmod installation in development environment
-InstallAs( '../darkmod/' + exe_name, thedarkmod )
+InstallAs("../darkmod/" + exe_name, thedarkmod)
# this runs always and produces TDM binary in local directory
-if ( BUILD == 'release' ): # strip debug info in release
- Command(exe_name, thedarkmod, "strip $SOURCE -o $TARGET")
+if BUILD == "release": # strip debug info in release
+ Command(exe_name, thedarkmod, "strip $SOURCE -o $TARGET")
else:
- InstallAs( '#' + exe_name, thedarkmod )
+ InstallAs("#" + exe_name, thedarkmod)
# end targets ------------------------------------
diff --git a/sys/scons/scons_utils.py b/sys/scons/scons_utils.py
index 377562c16..6593f64eb 100644
--- a/sys/scons/scons_utils.py
+++ b/sys/scons/scons_utils.py
@@ -1,189 +1,201 @@
# -*- mode: python -*-
-import sys, os, string, time, commands, re, pickle, StringIO, popen2, commands, pdb, zipfile, tempfile
+import sys, os, time, subprocess, re, pickle, io, subprocess, pdb, zipfile, tempfile
import SCons
# need an Environment and a matching buffered_spawn API .. encapsulate
class idBuffering:
- silent = False
-
- def buffered_spawn( self, sh, escape, cmd, args, env ):
- stderr = StringIO.StringIO()
- stdout = StringIO.StringIO()
- command_string = ''
- for i in args:
- if ( len( command_string ) ):
- command_string += ' '
- command_string += i
- try:
- retval = self.env['PSPAWN']( sh, escape, cmd, args, env, stdout, stderr )
- except OSError, x:
- if x.errno != 10:
- raise x
- print 'OSError ignored on command: %s' % command_string
- retval = 0
- print command_string
- if ( retval != 0 or not self.silent ):
- sys.stdout.write( stdout.getvalue() )
- sys.stderr.write( stderr.getvalue() )
- return retval
+ silent = False
+
+ def buffered_spawn(self, sh, escape, cmd, args, env):
+ stderr = io.StringIO()
+ stdout = io.StringIO()
+ command_string = ""
+ for i in args:
+ if len(command_string):
+ command_string += " "
+ command_string += i
+ try:
+ retval = self.env["PSPAWN"](sh, escape, cmd, args, env, stdout, stderr)
+ except OSError as x:
+ if x.errno != 10:
+ raise x
+ print("OSError ignored on command: %s" % command_string)
+ retval = 0
+ print(command_string)
+ if retval != 0 or not self.silent:
+ sys.stdout.write(stdout.getvalue())
+ sys.stderr.write(stderr.getvalue())
+ return retval
+
class idSetupBase:
-
- def SimpleCommand( self, cmd ):
- print cmd
- ret = commands.getstatusoutput( cmd )
- if ( len( ret[ 1 ] ) ):
- sys.stdout.write( ret[ 1 ] )
- sys.stdout.write( '\n' )
- if ( ret[ 0 ] != 0 ):
- raise 'command failed'
- return ret[ 1 ]
-
- def TrySimpleCommand( self, cmd ):
- print cmd
- ret = commands.getstatusoutput( cmd )
- sys.stdout.write( ret[ 1 ] )
-
- def M4Processing( self, file, d ):
- file_out = file[:-3]
- cmd = 'm4 '
- for ( key, val ) in d.items():
- cmd += '--define=%s="%s" ' % ( key, val )
- cmd += '%s > %s' % ( file, file_out )
- self.SimpleCommand( cmd )
-
- def ExtractProtocolVersion( self ):
- f = open( 'framework/Licensee.h' )
- l = f.readlines()
- f.close()
-
- major = 'X'
- p = re.compile( '^#define ASYNC_PROTOCOL_MAJOR\t*(.*)' )
- for i in l:
- if ( p.match( i ) ):
- major = p.match( i ).group(1)
- break
-
- f = open( 'framework/async/AsyncNetwork.h' )
- l = f.readlines()
- f.close()
-
- minor = 'X'
- p = re.compile( '^const int ASYNC_PROTOCOL_MINOR\t*= (.*);' )
- for i in l:
- if ( p.match( i ) ):
- minor = p.match( i ).group(1)
- break
-
- return '%s.%s' % ( major, minor )
-
- def ExtractEngineVersion( self ):
- f = open( 'framework/Licensee.h' )
- l = f.readlines()
- f.close()
-
- version = 'X'
- p = re.compile( '^#define.*ENGINE_VERSION\t*"DOOM (.*)"' )
- for i in l:
- if ( p.match( i ) ):
- version = p.match( i ).group(1)
- break
-
- return version
-
- def ExtractBuildVersion( self ):
- f = open( 'framework/BuildVersion.h' )
- l = f.readlines()[ 4 ]
- f.close()
- pat = re.compile( '.* = (.*);\n' )
- return pat.split( l )[ 1 ]
-
-def checkLDD( target, source, env ):
- file = target[0]
- if (not os.path.isfile(file.abspath)):
- print('ERROR: CheckLDD: target %s not found\n' % target[0])
- Exit(1)
- ( status, output ) = commands.getstatusoutput( 'ldd -r %s' % file )
- if ( status != 0 ):
- print 'ERROR: ldd command returned with exit code %d' % ldd_ret
- os.system( 'rm %s' % target[ 0 ] )
- sys.exit(1)
- lines = string.split( output, '\n' )
- have_undef = 0
- for i_line in lines:
- #print repr(i_line)
- regex = re.compile('undefined symbol: (.*)\t\\((.*)\\)')
- if ( regex.match(i_line) ):
- symbol = regex.sub('\\1', i_line)
- try:
- env['ALLOWED_SYMBOLS'].index(symbol)
- except:
- have_undef = 1
- if ( have_undef ):
- print output
- print "ERROR: undefined symbols"
- os.system('rm %s' % target[0])
- sys.exit(1)
-
-def SharedLibrarySafe( env, target, source ):
- ret = env.SharedLibrary( target, source )
- env.AddPostAction( ret, checkLDD )
- return ret
-
-def NotImplementedStub( *whatever ):
- print 'Not Implemented'
- sys.exit( 1 )
+ def SimpleCommand(self, cmd):
+ print(cmd)
+ ret = subprocess.getstatusoutput(cmd)
+ if len(ret[1]):
+ sys.stdout.write(ret[1])
+ sys.stdout.write("\n")
+ if ret[0] != 0:
+ raise RuntimeError("command failed")
+ return ret[1]
+
+ def TrySimpleCommand(self, cmd):
+ print(cmd)
+ ret = subprocess.getstatusoutput(cmd)
+ sys.stdout.write(ret[1])
+
+ def M4Processing(self, file, d):
+ file_out = file[:-3]
+ cmd = "m4 "
+ for (key, val) in list(d.items()):
+ cmd += '--define=%s="%s" ' % (key, val)
+ cmd += "%s > %s" % (file, file_out)
+ self.SimpleCommand(cmd)
+
+ def ExtractProtocolVersion(self):
+ f = open("framework/Licensee.h")
+ l = f.readlines()
+ f.close()
+
+ major = "X"
+ p = re.compile("^#define ASYNC_PROTOCOL_MAJOR\t*(.*)")
+ for i in l:
+ if p.match(i):
+ major = p.match(i).group(1)
+ break
+
+ f = open("framework/async/AsyncNetwork.h")
+ l = f.readlines()
+ f.close()
+
+ minor = "X"
+ p = re.compile("^const int ASYNC_PROTOCOL_MINOR\t*= (.*);")
+ for i in l:
+ if p.match(i):
+ minor = p.match(i).group(1)
+ break
+
+ return "%s.%s" % (major, minor)
+
+ def ExtractEngineVersion(self):
+ f = open("framework/Licensee.h")
+ l = f.readlines()
+ f.close()
+
+ version = "X"
+ p = re.compile('^#define.*ENGINE_VERSION\t*"DOOM (.*)"')
+ for i in l:
+ if p.match(i):
+ version = p.match(i).group(1)
+ break
+
+ return version
+
+ def ExtractBuildVersion(self):
+ f = open("framework/BuildVersion.h")
+ l = f.readlines()[4]
+ f.close()
+ pat = re.compile(".* = (.*);\n")
+ return pat.split(l)[1]
+
+
+def checkLDD(target, source, env):
+ file = target[0]
+ if not os.path.isfile(file.abspath):
+ print(("ERROR: CheckLDD: target %s not found\n" % target[0]))
+ Exit(1)
+ (status, output) = subprocess.getstatusoutput("ldd -r %s" % file)
+ if status != 0:
+ print("ERROR: ldd command returned with exit code %d" % ldd_ret)
+ os.system("rm %s" % target[0])
+ sys.exit(1)
+ lines = output.split("\n")
+ have_undef = 0
+ for i_line in lines:
+ # print repr(i_line)
+ regex = re.compile("undefined symbol: (.*)\t\\((.*)\\)")
+ if regex.match(i_line):
+ symbol = regex.sub("\\1", i_line)
+ try:
+ env["ALLOWED_SYMBOLS"].index(symbol)
+ except:
+ have_undef = 1
+ if have_undef:
+ print(output)
+ print("ERROR: undefined symbols")
+ os.system("rm %s" % target[0])
+ sys.exit(1)
+
+
+def SharedLibrarySafe(env, target, source):
+ ret = env.SharedLibrary(target, source)
+ env.AddPostAction(ret, checkLDD)
+ return ret
+
+
+def NotImplementedStub(*whatever):
+ print("Not Implemented")
+ sys.exit(1)
+
# --------------------------------------------------------------------
-class idGamePaks( idSetupBase ):
-
- def BuildGamePak( self, target = None, source = None, env = None ):
- # NOTE: ew should have done with zipfile module
- temp_dir = tempfile.mkdtemp( prefix = 'gamepak' )
- # source[0] is the binary path of the game DLL
- # source[2] is the DLL name 'gamex64.so'
- dllName = source[2].name
- self.SimpleCommand( 'cp %s %s' % ( source[0].abspath, os.path.join( temp_dir, dllName ) ) )
- self.SimpleCommand( 'strip %s' % os.path.join( temp_dir, dllName ) )
- self.SimpleCommand( 'echo 2 > %s' % ( os.path.join( temp_dir, 'binary.conf' ) ) )
- self.SimpleCommand( 'cd %s ; zip %s %s binary.conf' % ( temp_dir, os.path.join( temp_dir, target[0].abspath ), dllName ) )
- self.SimpleCommand( 'rm -r %s' % temp_dir )
- return None
+
+class idGamePaks(idSetupBase):
+ def BuildGamePak(self, target=None, source=None, env=None):
+ # NOTE: ew should have done with zipfile module
+ temp_dir = tempfile.mkdtemp(prefix="gamepak")
+ # source[0] is the binary path of the game DLL
+ # source[2] is the DLL name 'gamex64.so'
+ dllName = source[2].name
+ self.SimpleCommand(
+ "cp %s %s" % (source[0].abspath, os.path.join(temp_dir, dllName))
+ )
+ self.SimpleCommand("strip %s" % os.path.join(temp_dir, dllName))
+ self.SimpleCommand("echo 2 > %s" % (os.path.join(temp_dir, "binary.conf")))
+ self.SimpleCommand(
+ "cd %s ; zip %s %s binary.conf"
+ % (temp_dir, os.path.join(temp_dir, target[0].abspath), dllName)
+ )
+ self.SimpleCommand("rm -r %s" % temp_dir)
+ return None
+
# --------------------------------------------------------------------
# get a clean error output when running multiple jobs
-def SetupBufferedOutput( env, silent ):
- buf = idBuffering()
- buf.silent = silent
- buf.env = env
- env['SPAWN'] = buf.buffered_spawn
+def SetupBufferedOutput(env, silent):
+ buf = idBuffering()
+ buf.silent = silent
+ buf.env = env
+ env["SPAWN"] = buf.buffered_spawn
+
# setup utilities on an environement
-def SetupUtils( env ):
- gamepaks = idGamePaks()
- env.BuildGamePak = gamepaks.BuildGamePak
- env.SharedLibrarySafe = SharedLibrarySafe
- # no longer used by TDM
- env.PreBuildSDK = NotImplementedStub
- env.BuildSDK = NotImplementedStub
- env.BuildSetup = NotImplementedStub
-
-def BuildList( s_prefix, s_string ):
- s_list = string.split( s_string )
- for i in range( len( s_list ) ):
- s_list[i] = os.path.join(s_prefix, s_list[i])
- return s_list
+def SetupUtils(env):
+ gamepaks = idGamePaks()
+ env.BuildGamePak = gamepaks.BuildGamePak
+ env.SharedLibrarySafe = SharedLibrarySafe
+ # no longer used by TDM
+ env.PreBuildSDK = NotImplementedStub
+ env.BuildSDK = NotImplementedStub
+ env.BuildSetup = NotImplementedStub
-def CloneWithoutOptimization(env, opt_level):
- res = env.Clone()
- try:
- res['CPPFLAGS'].remove('-O3')
- except:
- print('Error: -O3 not found in CPPFLAGS, optimization not suppressed.')
- pass
- if opt_level is not None:
- res.Append(CPPFLAGS = opt_level)
- return res
+def BuildList(s_prefix, s_string):
+ s_list = s_string.split()
+ for i in range(len(s_list)):
+ s_list[i] = os.path.join(s_prefix, s_list[i])
+ return s_list
+
+
+def CloneWithoutOptimization(env, opt_level):
+ res = env.Clone()
+ try:
+ res["CPPFLAGS"].remove("-O3")
+ except:
+ print("Error: -O3 not found in CPPFLAGS, optimization not suppressed.")
+ pass
+ if opt_level is not None:
+ res.Append(CPPFLAGS=opt_level)
+ return res
diff --git a/tdm_update/SConstruct b/tdm_update/SConstruct
index 6d12703e2..119bc3c7c 100644
--- a/tdm_update/SConstruct
+++ b/tdm_update/SConstruct
@@ -1,32 +1,32 @@
# -*- mode: python -*-
# coding=utf-8
-#*****************************************************************************
+# *****************************************************************************
# The Dark Mod GPL Source Code
-#
-# This file is part of the The Dark Mod Source Code, originally based
+#
+# This file is part of the The Dark Mod Source Code, originally based
# on the Doom 3 GPL Source Code as published in 2011.
-#
-# The Dark Mod Source Code is free software: you can redistribute it
-# and/or modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation, either version 3 of the License,
+#
+# The Dark Mod Source Code is free software: you can redistribute it
+# and/or modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation, either version 3 of the License,
# or (at your option) any later version. For details, see LICENSE.TXT.
-#
+#
# Project: The Dark Mod Updater & Packager (http://www.thedarkmod.com/)
-#
-#*****************************************************************************
+#
+# *****************************************************************************
# The Dark Mod Updater & Packager build script for Linux
# Based on id's game sconscript
# Author: greebo
-import sys, os, time, commands, re, pickle, StringIO, commands, pdb, string
+import sys, os, time, subprocess, re, pickle, io, subprocess, pdb, string
import SCons
import scons_utils
# choose configuration variables which should be saved between runs
# ( we handle all those as strings )
-serialized=['CC', 'CXX', 'JOBS', 'BUILD', 'TARGET_ARCH']
+serialized = ["CC", "CXX", "JOBS", "BUILD", "TARGET_ARCH"]
# global build mode ------------------------------
@@ -59,199 +59,211 @@ TARGET_ARCH (default: "x86")
"""
-Help( help_string )
+Help(help_string)
# end help ---------------------------------------
# sanity -----------------------------------------
-EnsureSConsVersion( 0, 98 )
+EnsureSConsVersion(0, 98)
# end sanity -------------------------------------
# system detection -------------------------------
# CPU type
-cpu = commands.getoutput('uname -m')
-exp = re.compile('.*i?86.*')
+cpu = subprocess.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'
- elif ( cpu == 'amd64' ):
- # leave as is
- pass
- else:
- cpu = 'cpu'
-
-if sys.platform == 'darwin':
- g_os = 'MacOSX'
-elif sys.platform == 'freebsd10':
- # taaaki: only tested on FreeBSD 10 so far
- g_os = 'FreeBSD'
+ cpu = subprocess.getoutput("uname -p")
+ if cpu == "powerpc":
+ cpu = "ppc"
+ elif cpu == "amd64":
+ # leave as is
+ pass
+ else:
+ cpu = "cpu"
+
+if sys.platform == "darwin":
+ g_os = "MacOSX"
+elif sys.platform == "freebsd10":
+ # taaaki: only tested on FreeBSD 10 so far
+ g_os = "FreeBSD"
else:
- g_os = 'Linux'
+ g_os = "Linux"
# end system detection ---------------------------
# default settings -------------------------------
-CC = 'gcc'
-CXX = 'g++'
-if g_os == 'FreeBSD':
- # FreeBSD 10 uses Clang instead of GCC
- CC = 'cc'
- CXX = 'c++'
-JOBS = '1'
-BUILD = 'release'
-BASEFLAGS = ''
-TARGET_ARCH = 'x86'
+CC = "gcc"
+CXX = "g++"
+if g_os == "FreeBSD":
+ # FreeBSD 10 uses Clang instead of GCC
+ CC = "cc"
+ CXX = "c++"
+JOBS = "1"
+BUILD = "release"
+BASEFLAGS = ""
+TARGET_ARCH = "x86"
# end default settings ---------------------------
# command line settings --------------------------
-for k in ARGUMENTS.keys():
- exec_cmd = k + '=\'' + ARGUMENTS[k] + '\''
- print 'Command line: ' + exec_cmd
- exec( exec_cmd )
+for k in list(ARGUMENTS.keys()):
+ exec_cmd = k + "='" + ARGUMENTS[k] + "'"
+ print("Command line: " + exec_cmd)
+ exec(exec_cmd)
-if TARGET_ARCH == 'x32':
- TARGET_ARCH = 'x86'
+if TARGET_ARCH == "x32":
+ TARGET_ARCH = "x86"
# end command line settings ----------------------
# general configuration, target selection --------
-BUILD_ROOT = 'build'
-g_build = BUILD_ROOT + '/scons_' + TARGET_ARCH + '/' + BUILD
+BUILD_ROOT = "build"
+g_build = BUILD_ROOT + "/scons_" + TARGET_ARCH + "/" + BUILD
-SConsignFile( 'scons.signatures' )
-Decider('MD5-timestamp')
+SConsignFile("scons.signatures")
+Decider("MD5-timestamp")
-SetOption('num_jobs', JOBS)
+SetOption("num_jobs", JOBS)
LINK = CXX
# common flags
-BASECPPFLAGS = [ ]
-CORECPPPATH = [ ]
-CORELIBPATH = [ ]
-CORECPPFLAGS = [ ]
-BASELINKFLAGS = [ ]
+BASECPPFLAGS = []
+CORECPPPATH = []
+CORELIBPATH = []
+CORECPPFLAGS = []
+BASELINKFLAGS = []
# for release build, further optimisations that may not work on all files
-OPTCPPFLAGS = [ ]
+OPTCPPFLAGS = []
-BASECPPFLAGS.append( BASEFLAGS )
-BASECPPFLAGS.append( '-pipe' )
+BASECPPFLAGS.append(BASEFLAGS)
+BASECPPFLAGS.append("-pipe")
# warn all
-BASECPPFLAGS.append( '-Wall' )
+BASECPPFLAGS.append("-Wall")
# Use C++11 features
-BASECPPFLAGS.append( '-std=c++11' )
-if ( g_os == 'Linux' ):
- # Use old ABI for std::string and std::list (which is not fully compliant with C++11)
- # This allows to link with C++ libraries, which were built in older versions of GCC
- BASECPPFLAGS.append( '-D_GLIBCXX_USE_CXX11_ABI=0' )
+BASECPPFLAGS.append("-std=c++11")
+if g_os == "Linux":
+ # Use old ABI for std::string and std::list (which is not fully compliant with C++11)
+ # This allows to link with C++ libraries, which were built in older versions of GCC
+ BASECPPFLAGS.append("-D_GLIBCXX_USE_CXX11_ABI=0")
# Don't throw warnings for unknown pragmas (used by VC++)
-BASECPPFLAGS.append('-Wno-unknown-pragmas')
+BASECPPFLAGS.append("-Wno-unknown-pragmas")
# this define is necessary to make sure threading support is enabled in X
-CORECPPFLAGS.append( '-DXTHREADS' )
+CORECPPFLAGS.append("-DXTHREADS")
# don't wrap gcc messages
-BASECPPFLAGS.append( '-fmessage-length=0' )
-
-if ( TARGET_ARCH == 'x86' ):
- BASECPPFLAGS.append( '-m32' )
- BASELINKFLAGS.append( '-m32' )
-if ( TARGET_ARCH == 'x64' ):
- BASECPPFLAGS.append( '-m64' )
- BASELINKFLAGS.append( '-m64' )
-
-if g_os == 'Linux':
- BASELINKFLAGS.append( '-pthread' )
- BASELINKFLAGS.append( '-lrt' )
- # Add the __linux__ define
- BASECPPFLAGS.append('-D__linux__')
-elif g_os == 'FreeBSD':
- # FreeBSD 10
- BASELINKFLAGS.append( '-L/usr/local/lib' )
- BASELINKFLAGS.append( '-pthread' )
- BASELINKFLAGS.append( '-lrt' )
- # Add the __linux__ define - leave as is even though it isn't true
- BASECPPFLAGS.append('-D__linux__')
-elif g_os == 'MacOSX':
- # Mac OS X
- BASECPPFLAGS.append('-DMACOS_X')
- if TARGET_ARCH == 'x86':
- # Perform an Intel build
- BASECPPFLAGS.append(['-arch', 'i386', '-D__i386__'])
- BASELINKFLAGS.append(['-arch', 'i386'])
- elif TARGET_ARCH == 'ppc':
- # Perform a PowerPC build
- BASECPPFLAGS.append(['-arch', 'ppc', '-D__ppc__'])
- BASELINKFLAGS.append(['-arch', 'ppc'])
-
-if ( BUILD == 'debug' ):
- OPTCPPFLAGS = [ '-g', '-O1', '-D_DEBUG' ]
-elif ( BUILD == 'release' ):
- OPTCPPFLAGS = [ '-O2' ]
+BASECPPFLAGS.append("-fmessage-length=0")
+
+if TARGET_ARCH == "x86":
+ BASECPPFLAGS.append("-m32")
+ BASELINKFLAGS.append("-m32")
+if TARGET_ARCH == "x64":
+ BASECPPFLAGS.append("-m64")
+ BASELINKFLAGS.append("-m64")
+
+if g_os == "Linux":
+ BASELINKFLAGS.append("-pthread")
+ BASELINKFLAGS.append("-lrt")
+ # Add the __linux__ define
+ BASECPPFLAGS.append("-D__linux__")
+elif g_os == "FreeBSD":
+ # FreeBSD 10
+ BASELINKFLAGS.append("-L/usr/local/lib")
+ BASELINKFLAGS.append("-pthread")
+ BASELINKFLAGS.append("-lrt")
+ # Add the __linux__ define - leave as is even though it isn't true
+ BASECPPFLAGS.append("-D__linux__")
+elif g_os == "MacOSX":
+ # Mac OS X
+ BASECPPFLAGS.append("-DMACOS_X")
+ if TARGET_ARCH == "x86":
+ # Perform an Intel build
+ BASECPPFLAGS.append(["-arch", "i386", "-D__i386__"])
+ BASELINKFLAGS.append(["-arch", "i386"])
+ elif TARGET_ARCH == "ppc":
+ # Perform a PowerPC build
+ BASECPPFLAGS.append(["-arch", "ppc", "-D__ppc__"])
+ BASELINKFLAGS.append(["-arch", "ppc"])
+
+if BUILD == "debug":
+ OPTCPPFLAGS = ["-g", "-O1", "-D_DEBUG"]
+elif BUILD == "release":
+ OPTCPPFLAGS = ["-O2"]
else:
- print 'Unknown build configuration ' + BUILD
- sys.exit(0)
+ print("Unknown build configuration " + BUILD)
+ sys.exit(0)
# 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,
+)
# use includes from fbsd userland before darkmod includes
# note: used only on TDM server
-if g_os == 'FreeBSD':
- g_base_env.Append(CPPPATH = '/usr/local/include')
+if g_os == "FreeBSD":
+ g_base_env.Append(CPPPATH="/usr/local/include")
-g_base_env.Append(CPPPATH = '#/')
-path_template = '#/../ThirdParty/artefacts/{0}/include'
-g_base_env.Append(CPPPATH = path_template.format('zlib'))
-g_base_env.Append(CPPPATH = path_template.format('libcurl'))
-g_base_env.Append(CPPPATH = path_template.format('tinyformat'))
-g_base_env.Append(CPPPATH = '#/libtdm_update')
+g_base_env.Append(CPPPATH="#/")
+path_template = "#/../ThirdParty/artefacts/{0}/include"
+g_base_env.Append(CPPPATH=path_template.format("zlib"))
+g_base_env.Append(CPPPATH=path_template.format("libcurl"))
+g_base_env.Append(CPPPATH=path_template.format("tinyformat"))
+g_base_env.Append(CPPPATH="#/libtdm_update")
g_env = g_base_env.Clone()
-g_env['CPPFLAGS'] += OPTCPPFLAGS
-g_env.Append( CPPFLAGS = '-fno-strict-aliasing' )
-g_env['CPPFLAGS'] += CORECPPFLAGS
+g_env["CPPFLAGS"] += OPTCPPFLAGS
+g_env.Append(CPPFLAGS="-fno-strict-aliasing")
+g_env["CPPFLAGS"] += CORECPPFLAGS
# mark the globals
-GLOBALS = 'g_env g_os TARGET_ARCH libtdm_update_list'
+GLOBALS = "g_env g_os TARGET_ARCH libtdm_update_list"
# end general configuration ----------------------
# targets ----------------------------------------
libtdm_update_list = None
-Export( 'GLOBALS ' + GLOBALS )
+Export("GLOBALS " + GLOBALS)
# map this whole directory into build dir
-VariantDir( g_build, '.', duplicate = 0 )
+VariantDir(g_build, ".", duplicate=0)
# map 'ThirdParty' dir from parent directory into 'ThirdParty' subdir
-VariantDir( g_build + '/ThirdParty', '../ThirdParty', duplicate = 0 )
-Export( 'GLOBALS ' + GLOBALS )
+VariantDir(g_build + "/ThirdParty", "../ThirdParty", duplicate=0)
+Export("GLOBALS " + GLOBALS)
# build libraries
-libtdm_update_list = SConscript( g_build + '/SConscript.libtdm_update' )
-Export( 'GLOBALS ' + GLOBALS )
+libtdm_update_list = SConscript(g_build + "/SConscript.libtdm_update")
+Export("GLOBALS " + GLOBALS)
# Build the updater
-tdm_update = SConscript(g_build + '/SConscript.tdm_update')
-InstallAs( '#' + scons_utils.ExecutableName('bin/tdm_update', g_os, TARGET_ARCH), tdm_update )
+tdm_update = SConscript(g_build + "/SConscript.tdm_update")
+InstallAs(
+ "#" + scons_utils.ExecutableName("bin/tdm_update", g_os, TARGET_ARCH), tdm_update
+)
# Build the packager
-tdm_package = SConscript(g_build + '/SConscript.tdm_package')
-InstallAs( '#' + scons_utils.ExecutableName('bin/tdm_package', g_os, TARGET_ARCH), tdm_package )
+tdm_package = SConscript(g_build + "/SConscript.tdm_package")
+InstallAs(
+ "#" + scons_utils.ExecutableName("bin/tdm_package", g_os, TARGET_ARCH), tdm_package
+)
# end targets ------------------------------------
-
diff --git a/tdm_update/scons_utils.py b/tdm_update/scons_utils.py
index b61bbc22f..1f144fce8 100644
--- a/tdm_update/scons_utils.py
+++ b/tdm_update/scons_utils.py
@@ -1,19 +1,20 @@
-import sys, os, string
+import sys, os
def BuildList( s_prefix, s_string ):
- s_list = string.split( s_string )
- for i in range( len( s_list ) ):
- s_list[i] = os.path.join(s_prefix, s_list[i])
- return s_list
+ s_list = s_string.split()
+ for i in range( len( s_list ) ):
+ s_list[i] = os.path.join(s_prefix, s_list[i])
+ return s_list
+
def ExecutableName(base_name, os, arch):
- if os == 'Linux':
- if arch == 'x86':
- return base_name + '.linux'
- elif arch == 'x64':
- return base_name + '.linux64'
- elif os == 'FreeBSD':
- return base_name + '.fbsd'
- elif os == 'MacOSX':
- return base_name + '.macosx'
- return base_name
+ if os == "Linux":
+ if arch == "x86":
+ return base_name + ".linux"
+ elif arch == "x64":
+ return base_name + ".linux64"
+ elif os == "FreeBSD":
+ return base_name + ".fbsd"
+ elif os == "MacOSX":
+ return base_name + ".macosx"
+ return base_name
| ||||
| I just noticed this is a darkmod issue, not darkradiant. Put it in the wrong project. I will copy it over now. | |
| I filed this for the wrong project, please close as duplicate of https://bugs.thedarkmod.com/view.php?id=5234 | |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 30.04.2020 14:49 | t405 | New Issue | |
| 30.04.2020 14:49 | t405 | File Added: fix-scons-python2-001.patch | |
| 30.04.2020 15:29 | t405 | Note Added: 0012435 | |
| 30.04.2020 15:39 | t405 | Note Added: 0012437 | |
| 30.04.2020 17:47 | greebo | Project | DarkRadiant => The Dark Mod |
| 30.04.2020 17:47 | greebo | Category | Compilation/Build => General |
| 30.04.2020 17:48 | greebo | Relationship added | duplicate of 0005234 |
| 02.01.2023 16:10 | nbohr1more | Assigned To | => stgatilov |
| 02.01.2023 16:10 | nbohr1more | Status | new => closed |
| 02.01.2023 16:10 | nbohr1more | Resolution | open => duplicate |
| 02.01.2023 16:10 | nbohr1more | Category | General => Coding |
| 02.01.2023 16:10 | nbohr1more | Fixed in Version | => TDM 2.10 |