From 001c20dd47183823192a9b6bc1e3f7dc3f324648 Mon Sep 17 00:00:00 2001 From: "kjellander@webrtc.org" Date: Mon, 18 Apr 2016 16:32:52 +0200 Subject: [PATCH] Move logic of gyp_webrtc into gyp_webrtc.py For historical reasons gyp_webrtc.py was launcher script for gyp_webrtc and the python logic lived in the gyp_webrtc. This change moves python code into the .py file makes the extension-free gyp_webrtc a launcher for gyp_webrtc.py. Other changes: * Move the code into a main() function. * Add call to disable GC to save some processing time. * Set executable permission on gyp_webrtc.py and remove it from gyp_webrtc. Similar Chromium CL: https://codereview.chromium.org/1216863010 Motivation for this change: * Gets checked with PyLint * Easy to add unit tests if we add our own functionality. R=phoglund@webrtc.org TBR=tkchin@webrtc.org Review URL: https://codereview.webrtc.org/1895713002 . Cr-Commit-Position: refs/heads/master@{#12410} --- DEPS | 2 +- talk/app/webrtc/objc/README | 12 +-- webrtc/build/gyp_webrtc | 110 ++----------------------- webrtc/build/gyp_webrtc.py | 127 ++++++++++++++++++++++++++--- webrtc/build/ios/build_ios_libs.sh | 4 +- 5 files changed, 131 insertions(+), 124 deletions(-) mode change 100755 => 100644 webrtc/build/gyp_webrtc mode change 100644 => 100755 webrtc/build/gyp_webrtc.py diff --git a/DEPS b/DEPS index d93ea0807b..0694795012 100644 --- a/DEPS +++ b/DEPS @@ -87,7 +87,7 @@ hooks = [ # A change to a .gyp, .gypi, or to GYP itself should run the generator. 'name': 'gyp', 'pattern': '.', - 'action': ['python', 'src/webrtc/build/gyp_webrtc', + 'action': ['python', 'src/webrtc/build/gyp_webrtc.py', Var('extra_gyp_flag')], }, ] diff --git a/talk/app/webrtc/objc/README b/talk/app/webrtc/objc/README index ce2bb8ee36..f24ca24808 100644 --- a/talk/app/webrtc/objc/README +++ b/talk/app/webrtc/objc/README @@ -44,25 +44,25 @@ function wrmac() { export GYP_GENERATOR_FLAGS="$GYP_GENERATOR_FLAGS output_dir=out_mac" } -- Finally, run "webrtc/build/gyp_webrtc" to generate ninja files. +- Finally, run "webrtc/build/gyp_webrtc.py" to generate ninja files. Example of building & using the unittest & app: - To build & run the unittest (must target mac): - wrmac && ./webrtc/build/gyp_webrtc && \ + wrmac && ./webrtc/build/gyp_webrtc.py && \ ninja -C out_mac/Debug libjingle_peerconnection_objc_test && \ ./out_mac/Debug/libjingle_peerconnection_objc_test.app/Contents/MacOS/libjingle_peerconnection_objc_test - To build & launch the sample app on OSX: - wrmac && ./webrtc/build/gyp_webrtc && ninja -C out_mac/Debug AppRTCDemo && \ + wrmac && ./webrtc/build/gyp_webrtc.py && ninja -C out_mac/Debug AppRTCDemo && \ ./out_mac/Debug/AppRTCDemo.app/Contents/MacOS/AppRTCDemo - To build & launch the sample app on the iOS simulator: - wrsim && ./webrtc/build/gyp_webrtc && ninja -C out_sim/Debug iossim AppRTCDemo && \ + wrsim && ./webrtc/build/gyp_webrtc.py && ninja -C out_sim/Debug iossim AppRTCDemo && \ ./out_sim/Debug/iossim out_sim/Debug/AppRTCDemo.app - To build & sign the sample app for an iOS device (32 bit): - wrios32 && ./webrtc/build/gyp_webrtc && ninja -C out_ios/Debug-iphoneos AppRTCDemo + wrios32 && ./webrtc/build/gyp_webrtc.py && ninja -C out_ios/Debug-iphoneos AppRTCDemo - To build & sign the sample app for an iOS device (64 bit): - wrios64 && ./webrtc/build/gyp_webrtc && ninja -C out_ios/Debug-iphoneos AppRTCDemo + wrios64 && ./webrtc/build/gyp_webrtc.py && ninja -C out_ios/Debug-iphoneos AppRTCDemo diff --git a/webrtc/build/gyp_webrtc b/webrtc/build/gyp_webrtc old mode 100755 new mode 100644 index 2376cfbb85..c0a9ed9da8 --- a/webrtc/build/gyp_webrtc +++ b/webrtc/build/gyp_webrtc @@ -8,108 +8,10 @@ # in the file PATENTS. All contributing project authors may # be found in the AUTHORS file in the root of the source tree. -# This script is used to run GYP for WebRTC. It contains selected parts of the -# main function from the src/build/gyp_chromium file. +# Simple launcher script for gyp_webrtc.py. +# TODO(kjellander): This should probably be shell script but for historical +# reasons (all the python code used to live in this script without a +# .py extension, and was often run as 'python gyp_webrtc') it is +# currently still python. -import glob -import os -import shlex -import sys - -script_dir = os.path.dirname(os.path.realpath(__file__)) -checkout_root = os.path.abspath(os.path.join(script_dir, os.pardir, os.pardir)) - -sys.path.insert(0, os.path.join(checkout_root, 'build')) -import gyp_chromium -import gyp_helper -import vs_toolchain - -sys.path.insert(0, os.path.join(checkout_root, 'tools', 'gyp', 'pylib')) -import gyp - -def GetSupplementalFiles(): - """Returns a list of the supplemental files that are included in all GYP - sources.""" - # Can't use the one in gyp_chromium since the directory location of the root - # is different. - return glob.glob(os.path.join(checkout_root, '*', 'supplement.gypi')) - - -if __name__ == '__main__': - args = sys.argv[1:] - - if int(os.environ.get('GYP_CHROMIUM_NO_ACTION', 0)): - print 'Skipping gyp_webrtc due to GYP_CHROMIUM_NO_ACTION env var.' - sys.exit(0) - - if 'SKIP_WEBRTC_GYP_ENV' not in os.environ: - # Update the environment based on webrtc.gyp_env - gyp_env_path = os.path.join(os.path.dirname(checkout_root), - 'webrtc.gyp_env') - gyp_helper.apply_gyp_environment_from_file(gyp_env_path) - - # This could give false positives since it doesn't actually do real option - # parsing. Oh well. - gyp_file_specified = False - for arg in args: - if arg.endswith('.gyp'): - gyp_file_specified = True - break - - # If we didn't get a file, assume 'all.gyp' in the root of the checkout. - if not gyp_file_specified: - # Because of a bug in gyp, simply adding the abspath to all.gyp doesn't - # work, but chdir'ing and adding the relative path does. Spooky :/ - os.chdir(checkout_root) - args.append('all.gyp') - - # There shouldn't be a circular dependency relationship between .gyp files, - args.append('--no-circular-check') - - # Default to ninja unless GYP_GENERATORS is set. - if not os.environ.get('GYP_GENERATORS'): - os.environ['GYP_GENERATORS'] = 'ninja' - - # Enable check for missing sources in GYP files on Windows. - if sys.platform.startswith('win'): - gyp_generator_flags = os.getenv('GYP_GENERATOR_FLAGS', '') - if not 'msvs_error_on_missing_sources' in gyp_generator_flags: - os.environ['GYP_GENERATOR_FLAGS'] = ( - gyp_generator_flags + ' msvs_error_on_missing_sources=1') - - vs2013_runtime_dll_dirs = None - if int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1')): - vs2013_runtime_dll_dirs = vs_toolchain.SetEnvironmentAndGetRuntimeDllDirs() - - # Enforce gyp syntax checking. This adds about 20% execution time. - args.append('--check') - - supplemental_includes = GetSupplementalFiles() - gyp_vars = gyp_chromium.GetGypVars(supplemental_includes) - - # Automatically turn on crosscompile support for platforms that need it. - if all(('ninja' in os.environ.get('GYP_GENERATORS', ''), - gyp_vars.get('OS') in ['android', 'ios'], - 'GYP_CROSSCOMPILE' not in os.environ)): - os.environ['GYP_CROSSCOMPILE'] = '1' - - args.extend(['-I' + i for i in - gyp_chromium.additional_include_files(supplemental_includes, - args)]) - - # Set the gyp depth variable to the root of the checkout. - args.append('--depth=' + os.path.relpath(checkout_root)) - - print 'Updating projects from gyp files...' - sys.stdout.flush() - - # Off we go... - gyp_rc = gyp.main(args) - - if vs2013_runtime_dll_dirs: - x64_runtime, x86_runtime = vs2013_runtime_dll_dirs - vs_toolchain.CopyVsRuntimeDlls( - os.path.join(checkout_root, gyp_chromium.GetOutputDirectory()), - (x86_runtime, x64_runtime)) - - sys.exit(gyp_rc) +execfile(__file__ + '.py') diff --git a/webrtc/build/gyp_webrtc.py b/webrtc/build/gyp_webrtc.py old mode 100644 new mode 100755 index 87d8a57ddf..2d449716d0 --- a/webrtc/build/gyp_webrtc.py +++ b/webrtc/build/gyp_webrtc.py @@ -8,17 +8,122 @@ # in the file PATENTS. All contributing project authors may # be found in the AUTHORS file in the root of the source tree. -# This file is (possibly, depending on python version) imported by -# gyp_webrtc when GYP_PARALLEL=1 and it creates sub-processes -# through the multiprocessing library. - -# Importing in Python 2.6 (fixed in 2.7) on Windows doesn't search for -# imports that don't end in .py (and aren't directories with an -# __init__.py). This wrapper makes "import gyp_webrtc" work with -# those old versions and makes it possible to execute gyp_webrtc.py -# directly on Windows where the extension is useful. +# This script is used to run GYP for WebRTC. It contains selected parts of the +# main function from the src/build/gyp_chromium.py file while other parts are +# reused to minimize code duplication. +import gc +import glob import os +import sys + +script_dir = os.path.dirname(os.path.realpath(__file__)) +checkout_root = os.path.abspath(os.path.join(script_dir, os.pardir, os.pardir)) + +sys.path.insert(0, os.path.join(checkout_root, 'build')) +import gyp_chromium +import gyp_helper +import vs_toolchain + +sys.path.insert(0, os.path.join(checkout_root, 'tools', 'gyp', 'pylib')) +import gyp + + +def GetSupplementalFiles(): + """Returns a list of the supplemental files. + + A supplemental file is included in all GYP sources. Such files can be used to + override default values. + """ + # Can't use the one in gyp_chromium since the directory location of the root + # is different. + return glob.glob(os.path.join(checkout_root, '*', 'supplement.gypi')) + + +def main(): + # Disabling garbage collection saves about 5% processing time. Since this is a + # short-lived process it's not a problem. + gc.disable() + + args = sys.argv[1:] + + if int(os.environ.get('GYP_CHROMIUM_NO_ACTION', 0)): + print 'Skipping gyp_webrtc.py due to GYP_CHROMIUM_NO_ACTION env var.' + sys.exit(0) + + if 'SKIP_WEBRTC_GYP_ENV' not in os.environ: + # Update the environment based on webrtc.gyp_env. + gyp_env_path = os.path.join(os.path.dirname(checkout_root), + 'webrtc.gyp_env') + gyp_helper.apply_gyp_environment_from_file(gyp_env_path) + + # This could give false positives since it doesn't actually do real option + # parsing. Oh well. + gyp_file_specified = False + for arg in args: + if arg.endswith('.gyp'): + gyp_file_specified = True + break + + # If we didn't get a file, assume 'all.gyp' in the root of the checkout. + if not gyp_file_specified: + # Because of a bug in gyp, simply adding the abspath to all.gyp doesn't + # work, but chdir'ing and adding the relative path does. Spooky :/ + os.chdir(checkout_root) + args.append('all.gyp') + + # There shouldn't be a circular dependency relationship between .gyp files, + args.append('--no-circular-check') + + # Default to ninja unless GYP_GENERATORS is set. + if not os.environ.get('GYP_GENERATORS'): + os.environ['GYP_GENERATORS'] = 'ninja' + + # Enable check for missing sources in GYP files on Windows. + if sys.platform.startswith('win'): + gyp_generator_flags = os.getenv('GYP_GENERATOR_FLAGS', '') + if not 'msvs_error_on_missing_sources' in gyp_generator_flags: + os.environ['GYP_GENERATOR_FLAGS'] = ( + gyp_generator_flags + ' msvs_error_on_missing_sources=1') + + vs2013_runtime_dll_dirs = None, None + if int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1')): + vs2013_runtime_dll_dirs = vs_toolchain.SetEnvironmentAndGetRuntimeDllDirs() + + # Enforce gyp syntax checking. This adds about 20% execution time. + args.append('--check') + + supplemental_includes = GetSupplementalFiles() + gyp_vars = gyp_chromium.GetGypVars(supplemental_includes) + + # Automatically turn on crosscompile support for platforms that need it. + if all(('ninja' in os.environ.get('GYP_GENERATORS', ''), + gyp_vars.get('OS') in ['android', 'ios'], + 'GYP_CROSSCOMPILE' not in os.environ)): + os.environ['GYP_CROSSCOMPILE'] = '1' + + args.extend(['-I' + i for i in + gyp_chromium.additional_include_files(supplemental_includes, + args)]) + + # Set the gyp depth variable to the root of the checkout. + args.append('--depth=' + os.path.relpath(checkout_root)) + + print 'Updating projects from gyp files...' + sys.stdout.flush() + + # Off we go... + gyp_rc = gyp.main(args) + + if vs2013_runtime_dll_dirs: + x64_runtime, x86_runtime = vs2013_runtime_dll_dirs + vs_toolchain.CopyVsRuntimeDlls( + os.path.join(checkout_root, gyp_chromium.GetOutputDirectory()), + (x86_runtime, x64_runtime)) + + sys.exit(gyp_rc) + + +if __name__ == '__main__': + sys.exit(main()) -path = os.path.abspath(os.path.split(__file__)[0]) -execfile(os.path.join(path, 'gyp_webrtc')) diff --git a/webrtc/build/ios/build_ios_libs.sh b/webrtc/build/ios/build_ios_libs.sh index a01d128373..56175520fc 100755 --- a/webrtc/build/ios/build_ios_libs.sh +++ b/webrtc/build/ios/build_ios_libs.sh @@ -16,7 +16,7 @@ set -e # Globals. SCRIPT_DIR=$(cd $(dirname $0) && pwd) WEBRTC_BASE_DIR=${SCRIPT_DIR}/../../.. -GYP_WEBRTC_SCRIPT=${WEBRTC_BASE_DIR}/webrtc/build/gyp_webrtc +GYP_WEBRTC_SCRIPT=${WEBRTC_BASE_DIR}/webrtc/build/gyp_webrtc.py EXPORT_HEADERS_SCRIPT=${SCRIPT_DIR}/export_headers.py MERGE_SCRIPT=${SCRIPT_DIR}/merge_ios_libs.py @@ -70,7 +70,7 @@ clang_xcode=1 ios_override_visibility=1" # GYP generation requires relative path for some reason. pushd ${WEBRTC_BASE_DIR} - webrtc/build/gyp_webrtc webrtc/build/ios/merge_ios_libs.gyp + ${GYP_WEBRTC_SCRIPT} webrtc/build/ios/merge_ios_libs.gyp popd if [[ ${USE_LEGACY_API} -eq 1 ]]; then ninja -C ${ninja_output_dir}/${flavor} libjingle_peerconnection_objc_no_op