diff options
Diffstat (limited to 'o3d/build/build_nacl.py')
-rw-r--r-- | o3d/build/build_nacl.py | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/o3d/build/build_nacl.py b/o3d/build/build_nacl.py new file mode 100644 index 0000000..044e9a3 --- /dev/null +++ b/o3d/build/build_nacl.py @@ -0,0 +1,169 @@ +#!/usr/bin/python2.4 +# Copyright 2009 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file is just here so that we can modify the python path before +# invoking nixysa. + +import os +import os.path +import shutil +import subprocess +import sys + +third_party = os.path.join('..', '..', 'third_party') +gflags_dir = os.path.join(third_party, 'gflags', 'python') +sys.path.append(gflags_dir) + +import gflags + +FLAGS = gflags.FLAGS +gflags.DEFINE_string('configuration', 'Debug', + 'Specify which configuration to build.') + +gflags.DEFINE_string('platform', 'win', + 'Specify which platform to build.') + +gflags.DEFINE_boolean('debug', False, + 'Whether or not to turn on debug output ' + 'when running scons.') + +gflags.DEFINE_string('output', '.', 'Sets the output directory.') + + +def CopyIfNewer(inputs, output_dir): + '''Copy the inputs to the output directory, but only if the files are + newer than the destination files.''' + for input in inputs: + output = os.path.join(output_dir, os.path.basename(input)) + if os.path.exists(input): + if (not os.path.exists(output) or + os.path.getmtime(input) > os.path.getmtime(output)): + try: + print 'Copying from %s to %s' % (input, output) + shutil.copy2(input, output) + except: + return False + else: + print '%s is up to date.' % output + return True + +def PrependToPath(path, item): + '''Prepend an item to an environment variable path.''' + orig_path = os.environ.get(path) + if orig_path: + new_path = os.pathsep.join([item, orig_path]) + else: + new_path = item + + os.environ[path] = new_path + +def AppendToPath(path, item): + '''Append an item to an environment variable path.''' + orig_path = os.environ.get(path) + if orig_path: + new_path = os.pathsep.join([orig_path, item]) + else: + new_path = item + + os.environ[path] = new_path + +def FindPlatformSDK(): + '''On Windows, find the installed location of the Platform SDK.''' + import _winreg + try: + winsdk_key = _winreg.OpenKey( + _winreg.HKEY_LOCAL_MACHINE, + 'SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v6.1\\WinSDKBuild') + except WindowsError: + try: + winsdk_key = _winreg.OpenKey( + _winreg.HKEY_LOCAL_MACHINE, + 'SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v6.0A\\WinSDKBuild') + except WindowsError: + print 'The Windows SDK version 6.0 or later needs to be installed' + sys.exit(1) + try: + winsdk_dir, value_type = _winreg.QueryValueEx(winsdk_key, + 'InstallationFolder') + except WindowsError: + print 'The Windows SDK version 6.0 or later needs to be installed' + sys.exit(1) + _winreg.CloseKey(winsdk_key) + + # Strip off trailing slashes + winsdk_dir = winsdk_dir.rstrip('\\/') + AppendToPath('PATH', os.path.join(winsdk_dir, 'Bin')) + AppendToPath('INCLUDE', os.path.join(winsdk_dir, 'Include')) + AppendToPath('LIB', os.path.join(winsdk_dir, 'Lib')) + +def main(args): + extra_args = FLAGS(args) + # strip off argv[0] + extra_args = extra_args[1:] + + pythonpath = os.path.join(third_party, 'scons', 'scons-local') + PrependToPath('PYTHONPATH', pythonpath) + + binutils_path = os.path.join(third_party, 'gnu_binutils', 'files') + AppendToPath('PATH', binutils_path) + + config = 'opt' + if FLAGS.configuration == 'Debug': + config = 'dbg' + elif FLAGS.configuration == 'Release': + config = 'opt' + + mode = '%s-%s' % (config, FLAGS.platform) + + native_client_dir = os.path.join(third_party, 'native_client', + 'googleclient', 'native_client') + + args = [ + 'MODE=%s' % mode, + 'naclsdk_validate=0', + 'sdl=none', + '--verbose', + '--file=SConstruct', + '-C', + native_client_dir, + ] + scons = os.path.join(third_party, 'scons', 'scons.py') + args = [sys.executable, scons] + args + extra_args + + # Add the platform SDK to INCLUDE and LIB + if FLAGS.platform == 'win': + FindPlatformSDK() + + print 'Executing %s' % ' '.join(args) + status = subprocess.call(args) + + # Calculate what the output files should be. + outputs = [] + for arg in extra_args: + file_path = os.path.join(native_client_dir, + 'scons-out', mode, 'lib', arg) + if FLAGS.platform == 'win': + file_path = file_path + '.lib' + else: + file_path = file_path + '.a' + outputs.append(file_path) + + if status == 0 and not CopyIfNewer(outputs, FLAGS.output): + sys.exit(-1) + else: + sys.exit(status) + +if __name__ == '__main__': + main(sys.argv) |