diff options
Diffstat (limited to 'methods.py')
-rw-r--r-- | methods.py | 187 |
1 files changed, 102 insertions, 85 deletions
diff --git a/methods.py b/methods.py index 00c477635e..86ab7cd9af 100644 --- a/methods.py +++ b/methods.py @@ -4,19 +4,50 @@ import sys import re import glob import string -import datetime import subprocess -from compat import iteritems, isbasestring - - -def add_source_files(self, sources, filetype, lib_env=None, shared=False): - - if isbasestring(filetype): - dir_path = self.Dir('.').abspath - filetype = sorted(glob.glob(dir_path + "/" + filetype)) - - for path in filetype: - sources.append(self.Object(path)) +from compat import iteritems, isbasestring, decode_utf8 + + +def add_source_files(self, sources, files, warn_duplicates=True): + # Convert string to list of absolute paths (including expanding wildcard) + if isbasestring(files): + # Keep SCons project-absolute path as they are (no wildcard support) + if files.startswith('#'): + if '*' in files: + print("ERROR: Wildcards can't be expanded in SCons project-absolute path: '{}'".format(files)) + return + files = [files] + else: + dir_path = self.Dir('.').abspath + files = sorted(glob.glob(dir_path + "/" + files)) + + # Add each path as compiled Object following environment (self) configuration + for path in files: + obj = self.Object(path) + if obj in sources: + if warn_duplicates: + print("WARNING: Object \"{}\" already included in environment sources.".format(obj)) + else: + continue + sources.append(obj) + + +def disable_warnings(self): + # 'self' is the environment + if self.msvc: + # We have to remove existing warning level defines before appending /w, + # otherwise we get: "warning D9025 : overriding '/W3' with '/w'" + warn_flags = ['/Wall', '/W4', '/W3', '/W2', '/W1', '/WX'] + self.Append(CCFLAGS=['/w']) + self.Append(CFLAGS=['/w']) + self.Append(CXXFLAGS=['/w']) + self['CCFLAGS'] = [x for x in self['CCFLAGS'] if not x in warn_flags] + self['CFLAGS'] = [x for x in self['CFLAGS'] if not x in warn_flags] + self['CXXFLAGS'] = [x for x in self['CXXFLAGS'] if not x in warn_flags] + else: + self.Append(CCFLAGS=['-w']) + self.Append(CFLAGS=['-w']) + self.Append(CXXFLAGS=['-w']) def add_module_version_string(self,s): @@ -43,20 +74,29 @@ def update_version(module_version_string=""): f.write("#define VERSION_STATUS \"" + str(version.status) + "\"\n") f.write("#define VERSION_BUILD \"" + str(build_name) + "\"\n") f.write("#define VERSION_MODULE_CONFIG \"" + str(version.module_config) + module_version_string + "\"\n") - f.write("#define VERSION_YEAR " + str(2018) + "\n") + f.write("#define VERSION_YEAR " + str(version.year) + "\n") + f.write("#define VERSION_WEBSITE \"" + str(version.website) + "\"\n") f.close() # NOTE: It is safe to generate this file here, since this is still executed serially fhash = open("core/version_hash.gen.h", "w") githash = "" - if os.path.isfile(".git/HEAD"): - head = open(".git/HEAD", "r").readline().strip() + gitfolder = ".git" + + if os.path.isfile(".git"): + module_folder = open(".git", "r").readline().strip() + if module_folder.startswith("gitdir: "): + gitfolder = module_folder[8:] + + if os.path.isfile(os.path.join(gitfolder, "HEAD")): + head = open(os.path.join(gitfolder, "HEAD"), "r").readline().strip() if head.startswith("ref: "): - head = ".git/" + head[5:] + head = os.path.join(gitfolder, head[5:]) if os.path.isfile(head): githash = open(head, "r").readline().strip() else: githash = head + fhash.write("#define VERSION_HASH \"" + githash + "\"") fhash.close() @@ -155,7 +195,7 @@ def win32_spawn(sh, escape, cmd, args, env): env[e] = str(env[e]) proc = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, startupinfo=startupinfo, shell=False, env=env) - data, err = proc.communicate() + _, err = proc.communicate() rv = proc.wait() if rv: print("=====") @@ -192,70 +232,6 @@ def win32_spawn(sh, escape, cmd, args, spawnenv): return exit_code """ -def android_add_flat_dir(self, dir): - if (dir not in self.android_flat_dirs): - self.android_flat_dirs.append(dir) - -def android_add_maven_repository(self, url): - if (url not in self.android_maven_repos): - self.android_maven_repos.append(url) - -def android_add_dependency(self, depline): - if (depline not in self.android_dependencies): - self.android_dependencies.append(depline) - -def android_add_java_dir(self, subpath): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + subpath - if (base_path not in self.android_java_dirs): - self.android_java_dirs.append(base_path) - -def android_add_res_dir(self, subpath): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + subpath - if (base_path not in self.android_res_dirs): - self.android_res_dirs.append(base_path) - -def android_add_asset_dir(self, subpath): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + subpath - if (base_path not in self.android_asset_dirs): - self.android_asset_dirs.append(base_path) - -def android_add_aidl_dir(self, subpath): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + subpath - if (base_path not in self.android_aidl_dirs): - self.android_aidl_dirs.append(base_path) - -def android_add_jni_dir(self, subpath): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + subpath - if (base_path not in self.android_jni_dirs): - self.android_jni_dirs.append(base_path) - -def android_add_gradle_plugin(self, plugin): - if (plugin not in self.android_gradle_plugins): - self.android_gradle_plugins.append(plugin) - -def android_add_gradle_classpath(self, classpath): - if (classpath not in self.android_gradle_classpath): - self.android_gradle_classpath.append(classpath) - -def android_add_default_config(self, config): - if (config not in self.android_default_config): - self.android_default_config.append(config) - -def android_add_to_manifest(self, file): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + file - with open(base_path, "r") as f: - self.android_manifest_chunk += f.read() - -def android_add_to_permissions(self, file): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + file - with open(base_path, "r") as f: - self.android_permission_chunk += f.read() - -def android_add_to_attributes(self, file): - base_path = self.Dir(".").abspath + "/modules/" + self.current_module + "/" + file - with open(base_path, "r") as f: - self.android_appattributes_chunk += f.read() - def disable_module(self): self.disabled_modules.append(self.current_module) @@ -280,7 +256,7 @@ def use_windows_spawn_fix(self, platform=None): startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW proc = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, startupinfo=startupinfo, shell=False, env=env) - data, err = proc.communicate() + _, err = proc.communicate() rv = proc.wait() if rv: print("=====") @@ -318,7 +294,7 @@ def split_lib(self, libname, src_list = None, env_lib = None): list = [] lib_list = [] - if src_list == None: + if src_list is None: src_list = getattr(env, libname + "_sources") if type(env_lib) == type(None): @@ -525,7 +501,7 @@ def find_visual_c_batch_file(env): from SCons.Tool.MSCommon.vc import get_default_version, get_host_target, find_batch_file version = get_default_version(env) - (host_platform, target_platform,req_target_platform) = get_host_target(env) + (host_platform, target_platform, _) = get_host_target(env) return find_batch_file(env, version, host_platform, target_platform)[0] def generate_cpp_hint_file(filename): @@ -579,7 +555,7 @@ def generate_vs_project(env, num_jobs): release_debug_targets = ['bin\\godot.windows.opt.tools.32.exe'] + ['bin\\godot.windows.opt.tools.64.exe'] targets = debug_targets + release_targets + release_debug_targets if not env.get('MSVS'): - env['MSVS']['PROJECTSUFFIX'] = '.vcxproj' + env['MSVS']['PROJECTSUFFIX'] = '.vcxproj' env['MSVS']['SOLUTIONSUFFIX'] = '.sln' env.MSVSProject( target=['#godot' + env['MSVSPROJECTSUFFIX']], @@ -616,3 +592,44 @@ def CommandNoCache(env, target, sources, command, **args): result = env.Command(target, sources, command, **args) env.NoCache(result) return result + +def detect_darwin_sdk_path(platform, env): + sdk_name = '' + if platform == 'osx': + sdk_name = 'macosx' + var_name = 'MACOS_SDK_PATH' + elif platform == 'iphone': + sdk_name = 'iphoneos' + var_name = 'IPHONESDK' + elif platform == 'iphonesimulator': + sdk_name = 'iphonesimulator' + var_name = 'IPHONESDK' + else: + raise Exception("Invalid platform argument passed to detect_darwin_sdk_path") + + if not env[var_name]: + try: + sdk_path = decode_utf8(subprocess.check_output(['xcrun', '--sdk', sdk_name, '--show-sdk-path']).strip()) + if sdk_path: + env[var_name] = sdk_path + except (subprocess.CalledProcessError, OSError): + print("Failed to find SDK path while running xcrun --sdk {} --show-sdk-path.".format(sdk_name)) + raise + +def get_compiler_version(env): + # Not using this method on clang because it returns 4.2.1 # https://reviews.llvm.org/D56803 + if using_gcc(env): + version = decode_utf8(subprocess.check_output([env['CXX'], '-dumpversion']).strip()) + else: + version = decode_utf8(subprocess.check_output([env['CXX'], '--version']).strip()) + match = re.search('[0-9][0-9.]*', version) + if match is not None: + return match.group().split('.') + else: + return None + +def using_gcc(env): + return 'gcc' in os.path.basename(env["CC"]) + +def using_clang(env): + return 'clang' in os.path.basename(env["CC"]) |