Bläddra i källkod

Merge pull request #26666 from Calinou/update-server-buildsystem

Update the server platform's `detect.py` to match x11's
Rémi Verschelde 6 år sedan
förälder
incheckning
d592ee6be8
1 ändrade filer med 70 tillägg och 4 borttagningar
  1. 70 4
      platform/server/detect.py

+ 70 - 4
platform/server/detect.py

@@ -1,7 +1,10 @@
 import os
 import platform
 import sys
+from methods import get_compiler_version, use_gcc
 
+# This file is mostly based on platform/x11/detect.py.
+# If editing this file, make sure to apply relevant changes here too.
 
 def is_active():
     return True
@@ -26,10 +29,16 @@ def can_build():
 
 
 def get_opts():
-    from SCons.Variables import BoolVariable
+    from SCons.Variables import BoolVariable, EnumVariable
     return [
         BoolVariable('use_llvm', 'Use the LLVM compiler', False),
         BoolVariable('use_static_cpp', 'Link libgcc and libstdc++ statically for better portability', False),
+        BoolVariable('use_ubsan', 'Use LLVM/GCC compiler undefined behavior sanitizer (UBSAN)', False),
+        BoolVariable('use_asan', 'Use LLVM/GCC compiler address sanitizer (ASAN))', False),
+        BoolVariable('use_lsan', 'Use LLVM/GCC compiler leak sanitizer (LSAN))', False),
+        EnumVariable('debug_symbols', 'Add debugging symbols to release builds', 'yes', ('yes', 'no', 'full')),
+        BoolVariable('separate_debug_symbols', 'Create a separate file containing debugging symbols', False),
+        BoolVariable('execinfo', 'Use libexecinfo on systems where glibc is not available', False),
     ]
 
 
@@ -43,13 +52,30 @@ def configure(env):
     ## Build type
 
     if (env["target"] == "release"):
-        env.Append(CCFLAGS=['-O2', '-fomit-frame-pointer'])
+        if (env["optimize"] == "speed"): #optimize for speed (default)
+            env.Prepend(CCFLAGS=['-O3'])
+        else: #optimize for size
+            env.Prepend(CCFLAGS=['-Os'])
+
+        if (env["debug_symbols"] == "yes"):
+            env.Prepend(CCFLAGS=['-g1'])
+        if (env["debug_symbols"] == "full"):
+            env.Prepend(CCFLAGS=['-g2'])
 
     elif (env["target"] == "release_debug"):
-        env.Append(CCFLAGS=['-O2', '-DDEBUG_ENABLED'])
+        if (env["optimize"] == "speed"): #optimize for speed (default)
+            env.Prepend(CCFLAGS=['-O2', '-DDEBUG_ENABLED'])
+        else: #optimize for size
+            env.Prepend(CCFLAGS=['-Os', '-DDEBUG_ENABLED'])
+
+        if (env["debug_symbols"] == "yes"):
+            env.Prepend(CCFLAGS=['-g1'])
+        if (env["debug_symbols"] == "full"):
+            env.Prepend(CCFLAGS=['-g2'])
 
     elif (env["target"] == "debug"):
-        env.Append(CCFLAGS=['-g2', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED'])
+        env.Prepend(CCFLAGS=['-g3', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED'])
+        env.Append(LINKFLAGS=['-rdynamic'])
 
     ## Architecture
 
@@ -59,6 +85,10 @@ def configure(env):
 
     ## Compiler configuration
 
+    if 'CXX' in env and 'clang' in os.path.basename(env['CXX']):
+        # Convenience check to enforce the use_llvm overrides when CXX is clang(++)
+        env['use_llvm'] = True
+
     if env['use_llvm']:
         if ('clang++' not in os.path.basename(env['CXX'])):
             env["CC"] = "clang"
@@ -67,6 +97,35 @@ def configure(env):
         env.Append(CPPFLAGS=['-DTYPED_METHOD_BIND'])
         env.extra_suffix = ".llvm" + env.extra_suffix
 
+
+    if env['use_ubsan'] or env['use_asan'] or env['use_lsan']:
+        env.extra_suffix += "s"
+
+        if env['use_ubsan']:
+            env.Append(CCFLAGS=['-fsanitize=undefined'])
+            env.Append(LINKFLAGS=['-fsanitize=undefined'])
+
+        if env['use_asan']:
+            env.Append(CCFLAGS=['-fsanitize=address'])
+            env.Append(LINKFLAGS=['-fsanitize=address'])
+
+        if env['use_lsan']:
+            env.Append(CCFLAGS=['-fsanitize=leak'])
+            env.Append(LINKFLAGS=['-fsanitize=leak'])
+
+    if env['use_lto']:
+        env.Append(CCFLAGS=['-flto'])
+        if not env['use_llvm'] and env.GetOption("num_jobs") > 1:
+            env.Append(LINKFLAGS=['-flto=' + str(env.GetOption("num_jobs"))])
+        else:
+            env.Append(LINKFLAGS=['-flto'])
+        if not env['use_llvm']:
+            env['RANLIB'] = 'gcc-ranlib'
+            env['AR'] = 'gcc-ar'
+
+    env.Append(CCFLAGS=['-pipe'])
+    env.Append(LINKFLAGS=['-pipe'])
+
     ## Dependencies
 
     # FIXME: Check for existence of the libs before parsing their flags with pkg-config
@@ -110,6 +169,10 @@ def configure(env):
         env['builtin_libogg'] = False  # Needed to link against system libtheora
         env['builtin_libvorbis'] = False  # Needed to link against system libtheora
         env.ParseConfig('pkg-config theora theoradec --cflags --libs')
+    else:
+        list_of_x86 = ['x86_64', 'x86', 'i386', 'i586']
+        if any(platform.machine() in s for s in list_of_x86):
+            env["x86_libtheora_opt_gcc"] = True
 
     if not env['builtin_libvpx']:
         env.ParseConfig('pkg-config vpx --cflags --libs')
@@ -163,6 +226,9 @@ def configure(env):
         env.Append(LIBS=['dl'])
 
     if (platform.system().find("BSD") >= 0):
+        env["execinfo"] = True
+
+    if env["execinfo"]:
         env.Append(LIBS=['execinfo'])
 
     # Link those statically for portability