diff --git a/o3d/DEPS_chrome b/o3d/DEPS_chrome new file mode 100644 index 000000000000..0635b8785a65 --- /dev/null +++ b/o3d/DEPS_chrome @@ -0,0 +1,72 @@ +vars = { + "o3d_code_rev": "149", +} + +deps = { + "src/o3d/o3d_assets": + "http://o3d.googlecode.com/svn/trunk/googleclient/o3d_assets@" + Var("o3d_code_rev"), + + "src/third_party/antlr3": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/antlr3@" + Var("o3d_code_rev"), + + "src/third_party/cg": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/cg@" + Var("o3d_code_rev"), + + "src/third_party/fcollada": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/fcollada@" + Var("o3d_code_rev"), + + "src/third_party/jsdoctoolkit": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/jsdoctoolkit@" + Var("o3d_code_rev"), + + "src/third_party/pdiff": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/pdiff@" + Var("o3d_code_rev"), + + "src/third_party/zip_utils": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/zip_utils@" + Var("o3d_code_rev"), + + "src/third_party/selenium_rc": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/selenium_rc@" + Var("o3d_code_rev"), +} + +deps_os = { + "win": { + "src/third_party/wix_2_0_4221": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/wix_2_0_4221@" + Var("o3d_code_rev"), + }, +} +vars = { + "o3d_code_rev": "149", +} + +deps = { + "src/o3d/o3d_assets": + "http://o3d.googlecode.com/svn/trunk/googleclient/o3d_assets@" + Var("o3d_code_rev"), + + "src/third_party/antlr3": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/antlr3@" + Var("o3d_code_rev"), + + "src/third_party/cg": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/cg@" + Var("o3d_code_rev"), + + "src/third_party/fcollada": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/fcollada@" + Var("o3d_code_rev"), + + "src/third_party/jsdoctoolkit": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/jsdoctoolkit@" + Var("o3d_code_rev"), + + "src/third_party/pdiff": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/pdiff@" + Var("o3d_code_rev"), + + "src/third_party/zip_utils": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/zip_utils@" + Var("o3d_code_rev"), + + "src/third_party/selenium_rc": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/selenium_rc@" + Var("o3d_code_rev"), +} + +deps_os = { + "win": { + "src/third_party/wix_2_0_4221": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/wix_2_0_4221@" + Var("o3d_code_rev"), + }, +} \ No newline at end of file diff --git a/o3d/DEPS_gyp b/o3d/DEPS_gyp index 3fccefa35f70..f06121ec460f 100644 --- a/o3d/DEPS_gyp +++ b/o3d/DEPS_gyp @@ -41,15 +41,29 @@ deps = { "third_party/scons": "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/scons@" + Var("o3d_code_rev"), - "third_party/vectormath": - "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/vectormath@" + Var("o3d_code_rev"), - "third_party/zip_utils": "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/zip_utils@" + Var("o3d_code_rev"), "third_party/selenium_rc": "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/selenium_rc@" + Var("o3d_code_rev"), +# Stuff that is O3D specific (from a Chrome point of view). + + "o3d/third_party/vectormath": + "http://o3d.googlecode.com/svn/trunk/googleclient/third_party/vectormath@" + Var("o3d_code_rev"), + + "o3d/third_party/nixysa": + "http://nixysa.googlecode.com/svn/trunk/nixysa@" + Var("nixysa_rev"), + + "o3d/third_party/npapi": + "http://nixysa.googlecode.com/svn/trunk/third_party/npapi@" + Var("nixysa_rev"), + + "o3d/third_party/ply": + "http://nixysa.googlecode.com/svn/trunk/third_party/ply-3.1@" + Var("nixysa_rev"), + + "o3d/third_party/gflags": + "http://google-gflags.googlecode.com/svn/trunk@" + Var("gflags_rev"), + # Stuff from the Chromium tree. "third_party/harfbuzz": @@ -97,18 +111,6 @@ deps = { "breakpad/src": "http://google-breakpad.googlecode.com/svn/trunk/src@" + Var("breakpad_rev"), - "third_party/nixysa": - "http://nixysa.googlecode.com/svn/trunk/nixysa@" + Var("nixysa_rev"), - - "third_party/npapi": - "http://nixysa.googlecode.com/svn/trunk/third_party/npapi@" + Var("nixysa_rev"), - - "third_party/ply": - "http://nixysa.googlecode.com/svn/trunk/third_party/ply-3.1@" + Var("nixysa_rev"), - - "third_party/gflags": - "http://google-gflags.googlecode.com/svn/trunk@" + Var("gflags_rev"), - "testing/gtest": "http://googletest.googlecode.com/svn/trunk@" + Var("gtest_rev"), @@ -155,6 +157,6 @@ hooks = [ { # A change to a .gyp, .gypi, or to GYP itself should run the generator. "pattern": "\\.gypi?$|[/\\\\]src[/\\\\]tools[/\\\\]gyp[/\\\\]|[/\\\\]src[/\\\\]o3d[/\\\\]build[/\\\\]gyp_o3d$|MANIFEST$", - "action": ["python", "o3d/build/gyp_o3d", "o3d/build/all.gyp"], + "action": ["python", "o3d/build/gyp_o3d", "o3d/build/o3d.gyp"], }, ] diff --git a/o3d/build/build_nacl.py b/o3d/build/build_nacl.py deleted file mode 100644 index af4c5cf02e04..000000000000 --- a/o3d/build/build_nacl.py +++ /dev/null @@ -1,174 +0,0 @@ -#!/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: - try: - winsdk_key = _winreg.OpenKey( - _winreg.HKEY_LOCAL_MACHINE, - 'SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v6.0A\\VistaClientHeadersLibs') - 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) diff --git a/o3d/build/common.gypi b/o3d/build/common.gypi index 64613e753a6f..31697fdbe744 100644 --- a/o3d/build/common.gypi +++ b/o3d/build/common.gypi @@ -12,15 +12,21 @@ 'gtestdir': 'testing/gtest/include', 'jpegdir': 'third_party/libjpeg', 'nacldir': 'third_party/native_client/googleclient', - 'nixysadir': 'third_party/nixysa', - 'npapidir': 'third_party/npapi', + 'nixysadir': 'o3d/third_party/nixysa', + 'npapidir': 'o3d/third_party/npapi', 'pdiffdir': 'third_party/pdiff/files', 'pngdir': 'third_party/libpng', 'screenshotsdir': 'o3d_assets/tests/screenshots', 'seleniumdir': 'third_party/selenium_rc/files', 'skiadir': 'third_party/skia/include', 'zlibdir': 'third_party/zlib', - 'o3d_in_chrome%': 0, + # If the DEPS file exists two levels up, then we're in a Chrome tree. + 'o3d_in_chrome%': ' 0: - raise RuntimeError('FAILED: ' + ' '.join(args)) - - -def AppendBasePath(folder, filenames): - """Appends a base path to a ist of files""" - return [os.path.join(folder, filename) for filename in filenames] - - -def RunNixysa(idl_files, generate, output_dir, nixysa_options): - """Executes Nixysa.""" - Execute([ - sys.executable, - MakePath(_third_party_dir, 'nixysa', 'codegen.py'), - '--binding-module=o3d:%s' % MakePath('..', 'plugin', 'o3d_binding.py'), - '--generate=' + generate, - '--force', - '--output-dir=' + output_dir] + - nixysa_options + - idl_files) - - -def RunJSDocToolkit(js_files, ezt_output_dir, html_output_dir, prefix, mode, - baseURL, topURL, exports_file): - """Executes the JSDocToolkit.""" - list_filename = MakePath(_output_dir, 'doclist.conf') - f = open(list_filename, 'w') - f.write('{\nD:{\n') - f.write('prefix: "%s",\n' % prefix) - f.write('baseURL: "%s",\n' % baseURL) - f.write('topURL: "%s",\n' % topURL) - f.write('mode: "%s",\n' % mode) - f.write('htmlOutDir: "%s",\n' % html_output_dir.replace('\\', '/')) - f.write('exportsFile: "%s",\n' % exports_file.replace('\\', '/')) - f.write('endMarker: ""\n') - f.write('},\n') - f.write('_: [\n') - for filename in js_files: - f.write('"%s",\n' % filename.replace('\\', '/')) - f.write(']\n}\n') - f.close() - - files_dir = MakePath(_third_party_dir, 'jsdoctoolkit', 'files') - Execute([ - _java_exe, - '-Djsdoc.dir=%s' % files_dir, - '-jar', - MakePath(files_dir, 'jsrun.jar'), - MakePath(files_dir, 'app', 'run.js'), - '-v', - '-t=%s' % MakePath('jsdoc-toolkit-templates'), - '-d=' + ezt_output_dir, - '-c=' + list_filename]) - - -def DeleteOldDocs(docs_js_outpath): - try: - shutil.rmtree(docs_js_outpath); - except: - pass - -def BuildJavaScriptForDocsFromIDLs(idl_files, output_dir): - RunNixysa(idl_files, 'jsheader', output_dir, ['--properties-equal-undefined']) - - -def BuildJavaScriptForExternsFromIDLs(idl_files, output_dir): - if (os.path.exists(output_dir)): - for filename in glob.glob(os.path.join(output_dir, '*.js')): - os.unlink(filename) - RunNixysa(idl_files, 'jsheader', output_dir, ['--no-return-docs']) - - -def BuildO3DDocsFromJavaScript(js_files, ezt_output_dir, html_output_dir): - RunJSDocToolkit(js_files, ezt_output_dir, html_output_dir, - 'classo3d_1_1_', 'o3d', '', '', '') - - -def BuildO3DClassHierarchy(html_output_dir): - # TODO(gman): We need to make mutliple graphs. One for Params, one for - # ParamMatrix4, one for RenderNode, one for everythng else. - dot_path = MakePath(_third_party_dir, 'graphviz', 'files', 'bin', - MakeCommandName('dot')) - if os.path.exists(dot_path): - Execute([ - dot_path, - '-Tcmapx', '-o' + MakePath(html_output_dir, 'class_hierarchy.map'), - '-Tpng', '-o' + MakePath(html_output_dir, 'class_hierarchy.png'), - MakePath(html_output_dir, 'class_hierarchy.dot')]) - - -def BuildO3DJSDocs(js_files, ezt_output_dir, html_output_dir, exports_file): - # The backslashes below on 'jsdocs/' and '../' must stay. - RunJSDocToolkit(js_files, ezt_output_dir, html_output_dir, 'js_1_0_', 'o3djs', - 'jsdocs/', '../', exports_file) - - -def BuildO3DExternsFile(js_files_dir, extra_externs_file, externs_file): - outfile = open(externs_file, 'w') - filenames = (glob.glob(os.path.join(js_files_dir, '*.js')) + - [extra_externs_file]) - for filename in filenames: - print "-----", filename - infile = open(filename, 'r') - lines = infile.readlines() - infile.close() - filtered = [] - skipping = False - # strip out @o3dparameter stuff - for line in lines: - if skipping: - if line.startswith(' * @') or line.startswith(' */'): - skipping = False - if not skipping: - if line.startswith(' * @o3dparameter'): - skipping = True - if not skipping: - filtered.append(line) - outfile.write(''.join(filtered)) - outfile.close() - - -def BuildCompiledO3DJS(o3djs_files, - externs_path, - o3d_externs_js_path, - compiled_o3djs_outpath): - Execute([ - _java_exe, - '-jar', - MakePath('..', '..', 'o3d-internal', 'jscomp', 'JSCompiler_deploy.jar'), - '--property_renaming', 'OFF', - '--variable_renaming', 'LOCAL', - '--strict', - '--externs=%s' % externs_path, - ('--externs=%s' % o3d_externs_js_path), - ('--js_output_file=%s' % compiled_o3djs_outpath)] + - ['-js=%s' % (x, ) for x in o3djs_files]); - - # strip out goog.exportSymbol and move o3djs.require to end - file = open(compiled_o3djs_outpath, 'r') - contents = file.read() - file.close() - contents = re.sub(r'goog.exportSymbol\([^\)]*\);', '', contents) - requires = set(re.findall(r'o3djs.require\([^\)]*\);', contents)) - contents = re.sub(r'o3djs.require\([^\)]*\);', '', contents) - file = open(compiled_o3djs_outpath, 'w') - file.write(_js_copyright) - file.write(contents) - file.write('\n') - file.write('\n'.join(requires)) - file.close() - - -def CopyStaticFiles(o3d_docs_ezt_outpath, o3d_docs_html_outpath): - files = ['stylesheet.css', - 'prettify.css', - 'prettify.js', - 'tabs.css', - 'tab_l.gif', - 'tab_r.gif', - 'tab_b.gif'] - for file in files: - shutil.copyfile(MakePath('jsdoc-toolkit-templates', 'static', file), - MakePath(os.path.join(o3d_docs_ezt_outpath, file))) - shutil.copyfile(MakePath('jsdoc-toolkit-templates', 'static', file), - MakePath(os.path.join(o3d_docs_html_outpath, file))) - - -def main(argv): - """Builds the O3D API docs and externs and the o3djs docs.""" - global _java_exe - _java_exe = argv[0] - global _third_party_dir - _third_party_dir = argv[1] - - # Fix up the python path of subprocesses by setting PYTHONPATH. - pythonpath = os.pathsep.join([MakePath(_third_party_dir, 'gflags', 'python'), - MakePath(_third_party_dir, 'ply')]) - - orig_pythonpath = os.environ.get('PYTHONPATH') - if orig_pythonpath: - pythonpath = os.pathsep.join([pythonpath, orig_pythonpath]) - - os.environ['PYTHONPATH'] = pythonpath - - js_list_filename = MakePath('..', 'samples', 'o3djs', 'js_list.scons') - idl_list_filename = MakePath('..', 'plugin', 'idl_list.scons') - js_list_basepath = os.path.dirname(js_list_filename) - idl_list_basepath = os.path.dirname(idl_list_filename) - - global _output_dir - _output_dir = argv[2] - docs_outpath = os.path.join(_output_dir, 'documentation') - docs_js_outpath = MakePath(docs_outpath, 'apijs') - externs_js_outpath = MakePath(_output_dir, 'externs') - o3d_docs_ezt_outpath = MakePath(docs_outpath, 'reference') - o3d_docs_html_outpath = MakePath(docs_outpath, 'local_html') - o3djs_docs_ezt_outpath = MakePath(docs_outpath, 'reference', 'jsdocs') - o3djs_docs_html_outpath = MakePath(docs_outpath, 'local_html', 'jsdocs') - o3d_externs_path = MakePath(_output_dir, 'o3d-externs.js') - o3djs_exports_path = MakePath(_output_dir, 'o3d-exports.js') - compiled_o3djs_outpath = MakePath(docs_outpath, 'base.js') - externs_path = MakePath('externs', 'externs.js') - o3d_extra_externs_path = MakePath('externs', 'o3d-extra-externs.js') - - Import(js_list_filename) - Import(idl_list_filename) - - idl_files = AppendBasePath(idl_list_basepath, GlobalsDict['O3D_IDL_SOURCES']) - o3djs_files = AppendBasePath(js_list_basepath, GlobalsDict['O3D_JS_SOURCES']) - - # we need to put base.js first? - o3djs_files = ( - filter(lambda x: x.endswith('base.js'), o3djs_files) + - filter(lambda x: not x.endswith('base.js'), o3djs_files)) - - docs_js_files = [os.path.join( - docs_js_outpath, - os.path.splitext(os.path.basename(f))[0] + '.js') - for f in GlobalsDict['O3D_IDL_SOURCES']] - - DeleteOldDocs(MakePath(docs_outpath)) - BuildJavaScriptForDocsFromIDLs(idl_files, docs_js_outpath) - BuildO3DDocsFromJavaScript([o3d_extra_externs_path] + docs_js_files, - o3d_docs_ezt_outpath, o3d_docs_html_outpath) - BuildO3DClassHierarchy(o3d_docs_html_outpath) - BuildJavaScriptForExternsFromIDLs(idl_files, externs_js_outpath) - BuildO3DExternsFile(externs_js_outpath, - o3d_extra_externs_path, - o3d_externs_path) - BuildO3DJSDocs(o3djs_files + [o3d_externs_path], o3djs_docs_ezt_outpath, - o3djs_docs_html_outpath, o3djs_exports_path) - CopyStaticFiles(o3d_docs_ezt_outpath, o3d_docs_html_outpath) - BuildCompiledO3DJS(o3djs_files + [o3djs_exports_path], - externs_path, - o3d_externs_path, - compiled_o3djs_outpath) - - -if __name__ == '__main__': - main(sys.argv[1:]) +#!/usr/bin/python2.4 +# Copyright 2009, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +"""Docbuilder for O3D and o3djs.""" + + +import os +import os.path +import sys +import imp +import types +import glob +import subprocess +import shutil +import re + + +_java_exe = '' +_output_dir = '' +_third_party_dir = '' +_o3d_third_party_dir = '' +_script_path = os.path.dirname(os.path.realpath(__file__)) +_js_copyright = """ +/* + * Copyright 2009, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +""" + +GlobalsDict = { } + + +def MakePath(*file_paths): + """Makes a path absolute given a path relative to this script.""" + return os.path.join(_script_path, *file_paths) + + +def MakeCommandName(name): + """adds '.exe' if on Windows""" + if os.name == 'nt': + return name + '.exe' + return name + + +def UpdateGlobals(dict): + """Copies pairs from dict into GlobalDict.""" + for i, v in dict.items(): + GlobalsDict.__setitem__(i, v) + + +def GetCallingNamespaces(): + """Return the locals and globals for the function that called + into this module in the current call stack.""" + try: 1/0 + except ZeroDivisionError: + # Don't start iterating with the current stack-frame to + # prevent creating reference cycles (f_back is safe). + frame = sys.exc_info()[2].tb_frame.f_back + + # Find the first frame that *isn't* from this file + while frame.f_globals.get("__name__") == __name__: + frame = frame.f_back + + return frame.f_locals, frame.f_globals + + +def ComputeExports(exports): + """Compute a dictionary of exports given one of the parameters + to the Export() function or the exports argument to SConscript().""" + + loc, glob = GetCallingNamespaces() + + retval = {} + try: + for export in exports: + if isinstance(export, types.DictType): + retval.update(export) + else: + try: + retval[export] = loc[export] + except KeyError: + retval[export] = glob[export] + except KeyError, x: + raise Error, "Export of non-existent variable '%s'"%x + + return retval + + +def Export(*vars): + """Copies the named variables to GlobalDict.""" + for var in vars: + UpdateGlobals(ComputeExports(vars)) + + +def Import(filename): + """Imports a python file in a scope with 'Export' defined.""" + scope = {'__builtins__': globals()['__builtins__'], + 'Export': Export} + file = open(filename, 'r') + exec file in scope + file.close() + + +def Execute(args): + """Executes an external program.""" + # Comment the next line in for debugging. + # print "Execute: ", ' '.join(args) + if subprocess.call(args) > 0: + raise RuntimeError('FAILED: ' + ' '.join(args)) + + +def AppendBasePath(folder, filenames): + """Appends a base path to a ist of files""" + return [os.path.join(folder, filename) for filename in filenames] + + +def RunNixysa(idl_files, generate, output_dir, nixysa_options): + """Executes Nixysa.""" + Execute([ + sys.executable, + MakePath(_o3d_third_party_dir, 'nixysa', 'codegen.py'), + '--binding-module=o3d:%s' % MakePath('..', 'plugin', 'o3d_binding.py'), + '--generate=' + generate, + '--force', + '--output-dir=' + output_dir] + + nixysa_options + + idl_files) + + +def RunJSDocToolkit(js_files, ezt_output_dir, html_output_dir, prefix, mode, + baseURL, topURL, exports_file): + """Executes the JSDocToolkit.""" + list_filename = MakePath(_output_dir, 'doclist.conf') + f = open(list_filename, 'w') + f.write('{\nD:{\n') + f.write('prefix: "%s",\n' % prefix) + f.write('baseURL: "%s",\n' % baseURL) + f.write('topURL: "%s",\n' % topURL) + f.write('mode: "%s",\n' % mode) + f.write('htmlOutDir: "%s",\n' % html_output_dir.replace('\\', '/')) + f.write('exportsFile: "%s",\n' % exports_file.replace('\\', '/')) + f.write('endMarker: ""\n') + f.write('},\n') + f.write('_: [\n') + for filename in js_files: + f.write('"%s",\n' % filename.replace('\\', '/')) + f.write(']\n}\n') + f.close() + + files_dir = MakePath(_third_party_dir, 'jsdoctoolkit', 'files') + Execute([ + _java_exe, + '-Djsdoc.dir=%s' % files_dir, + '-jar', + MakePath(files_dir, 'jsrun.jar'), + MakePath(files_dir, 'app', 'run.js'), + '-v', + '-t=%s' % MakePath('jsdoc-toolkit-templates'), + '-d=' + ezt_output_dir, + '-c=' + list_filename]) + + +def DeleteOldDocs(docs_js_outpath): + try: + shutil.rmtree(docs_js_outpath); + except: + pass + +def BuildJavaScriptForDocsFromIDLs(idl_files, output_dir): + RunNixysa(idl_files, 'jsheader', output_dir, ['--properties-equal-undefined']) + + +def BuildJavaScriptForExternsFromIDLs(idl_files, output_dir): + if (os.path.exists(output_dir)): + for filename in glob.glob(os.path.join(output_dir, '*.js')): + os.unlink(filename) + RunNixysa(idl_files, 'jsheader', output_dir, ['--no-return-docs']) + + +def BuildO3DDocsFromJavaScript(js_files, ezt_output_dir, html_output_dir): + RunJSDocToolkit(js_files, ezt_output_dir, html_output_dir, + 'classo3d_1_1_', 'o3d', '', '', '') + + +def BuildO3DClassHierarchy(html_output_dir): + # TODO(gman): We need to make mutliple graphs. One for Params, one for + # ParamMatrix4, one for RenderNode, one for everythng else. + dot_path = MakePath(_third_party_dir, 'graphviz', 'files', 'bin', + MakeCommandName('dot')) + if os.path.exists(dot_path): + Execute([ + dot_path, + '-Tcmapx', '-o' + MakePath(html_output_dir, 'class_hierarchy.map'), + '-Tpng', '-o' + MakePath(html_output_dir, 'class_hierarchy.png'), + MakePath(html_output_dir, 'class_hierarchy.dot')]) + + +def BuildO3DJSDocs(js_files, ezt_output_dir, html_output_dir, exports_file): + # The backslashes below on 'jsdocs/' and '../' must stay. + RunJSDocToolkit(js_files, ezt_output_dir, html_output_dir, 'js_1_0_', 'o3djs', + 'jsdocs/', '../', exports_file) + + +def BuildO3DExternsFile(js_files_dir, extra_externs_file, externs_file): + outfile = open(externs_file, 'w') + filenames = (glob.glob(os.path.join(js_files_dir, '*.js')) + + [extra_externs_file]) + for filename in filenames: + print "-----", filename + infile = open(filename, 'r') + lines = infile.readlines() + infile.close() + filtered = [] + skipping = False + # strip out @o3dparameter stuff + for line in lines: + if skipping: + if line.startswith(' * @') or line.startswith(' */'): + skipping = False + if not skipping: + if line.startswith(' * @o3dparameter'): + skipping = True + if not skipping: + filtered.append(line) + outfile.write(''.join(filtered)) + outfile.close() + + +def BuildCompiledO3DJS(o3djs_files, + externs_path, + o3d_externs_js_path, + compiled_o3djs_outpath): + Execute([ + _java_exe, + '-jar', + MakePath('..', '..', 'o3d-internal', 'jscomp', 'JSCompiler_deploy.jar'), + '--property_renaming', 'OFF', + '--variable_renaming', 'LOCAL', + '--strict', + '--externs=%s' % externs_path, + ('--externs=%s' % o3d_externs_js_path), + ('--js_output_file=%s' % compiled_o3djs_outpath)] + + ['-js=%s' % (x, ) for x in o3djs_files]); + + # strip out goog.exportSymbol and move o3djs.require to end + file = open(compiled_o3djs_outpath, 'r') + contents = file.read() + file.close() + contents = re.sub(r'goog.exportSymbol\([^\)]*\);', '', contents) + requires = set(re.findall(r'o3djs.require\([^\)]*\);', contents)) + contents = re.sub(r'o3djs.require\([^\)]*\);', '', contents) + file = open(compiled_o3djs_outpath, 'w') + file.write(_js_copyright) + file.write(contents) + file.write('\n') + file.write('\n'.join(requires)) + file.close() + + +def CopyStaticFiles(o3d_docs_ezt_outpath, o3d_docs_html_outpath): + files = ['stylesheet.css', + 'prettify.css', + 'prettify.js', + 'tabs.css', + 'tab_l.gif', + 'tab_r.gif', + 'tab_b.gif'] + for file in files: + shutil.copyfile(MakePath('jsdoc-toolkit-templates', 'static', file), + MakePath(os.path.join(o3d_docs_ezt_outpath, file))) + shutil.copyfile(MakePath('jsdoc-toolkit-templates', 'static', file), + MakePath(os.path.join(o3d_docs_html_outpath, file))) + + +def main(argv): + """Builds the O3D API docs and externs and the o3djs docs.""" + global _java_exe + _java_exe = argv[0] + global _third_party_dir + _third_party_dir = argv[1] + global _o3d_third_party_dir + _o3d_third_party_dir = os.path.normpath( + os.path.join(os.path.dirname(__file__), '..', 'third_party')) + + # Fix up the python path of subprocesses by setting PYTHONPATH. + pythonpath = os.pathsep.join([MakePath(_o3d_third_party_dir, 'gflags', 'python'), + MakePath(_o3d_third_party_dir, 'ply')]) + + orig_pythonpath = os.environ.get('PYTHONPATH') + if orig_pythonpath: + pythonpath = os.pathsep.join([pythonpath, orig_pythonpath]) + + os.environ['PYTHONPATH'] = pythonpath + + js_list_filename = MakePath('..', 'samples', 'o3djs', 'js_list.scons') + idl_list_filename = MakePath('..', 'plugin', 'idl_list.scons') + js_list_basepath = os.path.dirname(js_list_filename) + idl_list_basepath = os.path.dirname(idl_list_filename) + + global _output_dir + _output_dir = argv[2] + docs_outpath = os.path.join(_output_dir, 'documentation') + docs_js_outpath = MakePath(docs_outpath, 'apijs') + externs_js_outpath = MakePath(_output_dir, 'externs') + o3d_docs_ezt_outpath = MakePath(docs_outpath, 'reference') + o3d_docs_html_outpath = MakePath(docs_outpath, 'local_html') + o3djs_docs_ezt_outpath = MakePath(docs_outpath, 'reference', 'jsdocs') + o3djs_docs_html_outpath = MakePath(docs_outpath, 'local_html', 'jsdocs') + o3d_externs_path = MakePath(_output_dir, 'o3d-externs.js') + o3djs_exports_path = MakePath(_output_dir, 'o3d-exports.js') + compiled_o3djs_outpath = MakePath(docs_outpath, 'base.js') + externs_path = MakePath('externs', 'externs.js') + o3d_extra_externs_path = MakePath('externs', 'o3d-extra-externs.js') + + Import(js_list_filename) + Import(idl_list_filename) + + idl_files = AppendBasePath(idl_list_basepath, GlobalsDict['O3D_IDL_SOURCES']) + o3djs_files = AppendBasePath(js_list_basepath, GlobalsDict['O3D_JS_SOURCES']) + + # we need to put base.js first? + o3djs_files = ( + filter(lambda x: x.endswith('base.js'), o3djs_files) + + filter(lambda x: not x.endswith('base.js'), o3djs_files)) + + docs_js_files = [os.path.join( + docs_js_outpath, + os.path.splitext(os.path.basename(f))[0] + '.js') + for f in GlobalsDict['O3D_IDL_SOURCES']] + + DeleteOldDocs(MakePath(docs_outpath)) + BuildJavaScriptForDocsFromIDLs(idl_files, docs_js_outpath) + BuildO3DDocsFromJavaScript([o3d_extra_externs_path] + docs_js_files, + o3d_docs_ezt_outpath, o3d_docs_html_outpath) + BuildO3DClassHierarchy(o3d_docs_html_outpath) + BuildJavaScriptForExternsFromIDLs(idl_files, externs_js_outpath) + BuildO3DExternsFile(externs_js_outpath, + o3d_extra_externs_path, + o3d_externs_path) + BuildO3DJSDocs(o3djs_files + [o3d_externs_path], o3djs_docs_ezt_outpath, + o3djs_docs_html_outpath, o3djs_exports_path) + CopyStaticFiles(o3d_docs_ezt_outpath, o3d_docs_html_outpath) + BuildCompiledO3DJS(o3djs_files + [o3djs_exports_path], + externs_path, + o3d_externs_path, + compiled_o3djs_outpath) + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/o3d/plugin/cross/main.h b/o3d/plugin/cross/main.h index 049c68846881..5d77d59d991c 100644 --- a/o3d/plugin/cross/main.h +++ b/o3d/plugin/cross/main.h @@ -55,16 +55,16 @@ #include "third_party/nixysa/static_glue/npapi/common.h" #include "third_party/nixysa/static_glue/npapi/npn_api.h" -#if defined(O3D_INTERNAL_PLUGIN) -#define HANDLE_CRASHES void(0) -#else // O3D_INTERNAL_PLUGIN - #if defined(OS_LINUX) #define EXPORT_SYMBOL __attribute__((visibility ("default"))) #else #define EXPORT_SYMBOL #endif +#if defined(O3D_INTERNAL_PLUGIN) +#define HANDLE_CRASHES void(0) +#else // O3D_INTERNAL_PLUGIN + extern ExceptionManager *g_exception_manager; // BreakpadEnabler is a simple class to keep track of whether or not diff --git a/o3d/plugin/idl/codegen.py b/o3d/plugin/idl/codegen.py index 7494c2124fdc..d82d7ab098d5 100644 --- a/o3d/plugin/idl/codegen.py +++ b/o3d/plugin/idl/codegen.py @@ -22,7 +22,7 @@ script_dir = os.path.join(os.path.dirname(__file__)) third_party = os.path.normpath( - os.path.join(script_dir, '..', '..', '..', 'third_party')) + os.path.join(script_dir, '..', '..', 'third_party')) pythonpath = os.pathsep.join([os.path.join(third_party, 'gflags', 'python'), os.path.join(third_party, 'ply')]) diff --git a/o3d/plugin/idl/idl.gyp b/o3d/plugin/idl/idl.gyp index 7a393aebfb57..1e710c185482 100644 --- a/o3d/plugin/idl/idl.gyp +++ b/o3d/plugin/idl/idl.gyp @@ -9,7 +9,7 @@ 'variables': { 'chromium_code': 0, 'idl_out_path': '<(SHARED_INTERMEDIATE_DIR)/idl_glue', - 'static_glue_dir': '../../../third_party/nixysa/static_glue/npapi', + 'static_glue_dir': '../../../<(nixysadir)/static_glue/npapi', 'idl_files': [ 'archive_request.idl', 'bitmap.idl', @@ -116,6 +116,18 @@ ], }, 'targets': [ + { + # This target is only used when we're not built as part of Chrome, + # since chrome has its own implementation of the NPAPI from webkit. + 'target_name': 'o3dNpnApi', + 'type': 'static_library', + 'include_dirs': [ + '../../../<(npapidir)/include', + ], + 'sources': [ + '<(static_glue_dir)/npn_api.cc', + ], + }, { 'target_name': 'o3dPluginIdl', 'type': 'static_library', @@ -136,14 +148,10 @@ 'action_name': 'generate_idl', 'process_outputs_as_sources': 1, 'inputs': [ - '../../../<(nixysadir)/codegen.py', - 'codegen.py', '<@(idl_files)', ], 'outputs': [ - # TODO(bradnelson): fix gyp to be able to handle outputs without - # and extension on linux. - #'<(idl_out_path)/hash', + '<(idl_out_path)/hash', '<(idl_out_path)/globals_glue.cc', '<(idl_out_path)/globals_glue.h', '(.*)(.*)', - re.DOTALL) - - content = GetFileContents(sample_file) - m = script_re.match(content) - if not m: - raise Exception('Script regexp failed on input file %s' % sample_file) - (html_start, type, charset, id, script, html_end) = m.groups() - if not type: - raise Exception('Found a script (%s) that lacked the javascript tag!' - % sample_file) - if not charset: - charset = '' - - html_content = ( - '%(html_start)s%(html_end)s' % - { - 'html_start' : html_start, - 'type' : type, - 'id' : id, - 'charset' : charset, - 'js_path' : os.path.basename(output_js), - 'html_end' : html_end - }) - - if not SetFileContentsIfDifferent(output_html, html_content): - return False - if not SetFileContentsIfDifferent(output_js, copyright_header + script): - return False - return True - -def main(argv): - try: - files = FLAGS(argv) # Parse flags - except gflags.FlagsError, e: - print '%s.\nUsage: %s []\n%s' % \ - (e, sys.argv[0], FLAGS) - sys.exit(2) - - # Strip off argv[0] to leave a list of html files to split. - files = files[1:] - - if FLAGS.find_candidates: - return FindCandidates() - - for file in files: - basename = os.path.basename(file) - output_html = os.path.join(FLAGS.products, basename) - output_js = os.path.splitext(output_html)[0] + '.js' - print "Splitting sample %s into %s and %s" % (file, output_html, output_js) - if not SplitSample(file, output_html, output_js): - sys.exit(2) - -if __name__ == "__main__": - main(sys.argv) diff --git a/o3d/tests/selenium/main.py b/o3d/tests/selenium/main.py index cc19ad74a2e9..d8425a01bbcc 100644 --- a/o3d/tests/selenium/main.py +++ b/o3d/tests/selenium/main.py @@ -45,7 +45,8 @@ o3d_dir = os.path.dirname(os.path.dirname(script_dir)) src_dir = os.path.dirname(o3d_dir) third_party_dir = os.path.join(src_dir, 'third_party') -gflags_dir = os.path.join(third_party_dir, 'gflags', 'python') +o3d_third_party_dir = os.path.join(o3d_dir, 'third_party') +gflags_dir = os.path.join(o3d_third_party_dir, 'gflags', 'python') selenium_dir = os.path.join(third_party_dir, 'selenium_rc', 'files') selenium_py_dir = os.path.join(selenium_dir, 'selenium-python-client-driver') sys.path.append(gflags_dir) diff --git a/o3d/tests/selenium/unpack_firefox.py b/o3d/tests/selenium/unpack_firefox.py index 4cafefce0be0..a969c44ccc53 100644 --- a/o3d/tests/selenium/unpack_firefox.py +++ b/o3d/tests/selenium/unpack_firefox.py @@ -8,7 +8,7 @@ script_dir = os.path.normpath(os.path.dirname(os.path.abspath(__file__))) o3d_dir = os.path.dirname(os.path.dirname(script_dir)) src_dir = os.path.dirname(o3d_dir) -third_party_dir = os.path.join(src_dir, 'third_party') +third_party_dir = os.path.join(o3d_dir, 'third_party') internal_dir = os.path.join(src_dir, 'o3d-internal') gflags_dir = os.path.join(third_party_dir, 'gflags', 'python') sys.path.append(gflags_dir)