def check_api_calls(opts): # Returns True if no calls through API classes in implementation. temp_dir = tempfile.mkdtemp() # Extract API class files from jar jar_cmd = ['jar', 'xf', os.path.abspath(opts.api_jar)] build_utils.CheckOutput(jar_cmd, cwd=temp_dir) shutil.rmtree(os.path.join(temp_dir, 'META-INF'), ignore_errors=True) # Collect names of API classes api_classes = [] for dirpath, _, filenames in os.walk(temp_dir): if not filenames: continue package = os.path.relpath(dirpath, temp_dir) for filename in filenames: if filename.endswith('.class'): classname = filename[:-len('.class')] api_classes += [ os.path.normpath(os.path.join(package, classname)) ] shutil.rmtree(temp_dir) temp_dir = tempfile.mkdtemp() # Extract impl class files from jars for impl_jar in opts.impl_jar: jar_cmd = ['jar', 'xf', os.path.abspath(impl_jar)] build_utils.CheckOutput(jar_cmd, cwd=temp_dir) shutil.rmtree(os.path.join(temp_dir, 'META-INF'), ignore_errors=True) # Process classes bad_api_calls = [] for dirpath, _, filenames in os.walk(temp_dir): if not filenames: continue # Dump classes dump_file = os.path.join(temp_dir, 'dump.txt') if os.system( 'javap -c %s > %s' % (' '.join(os.path.join(dirpath, f) for f in filenames).replace('$', '\\$'), dump_file)): print 'ERROR: javap failed on ' + ' '.join(filenames) return False # Process class dump with open(dump_file, 'r') as dump: find_api_calls(dump, api_classes, bad_api_calls) shutil.rmtree(temp_dir) if bad_api_calls: print 'ERROR: Found the following calls from implementation classes through' print ' API classes. These could fail if older API is used that' print ' does not contain newer methods. Please call through a' print ' wrapper class from VersionSafeCallbacks.' print '\n'.join(bad_api_calls) return not bad_api_calls
def main(): parser = optparse.OptionParser() build_utils.AddDepfileOption(parser) parser.add_option('--output-dir', help='Directory to put javadoc') parser.add_option('--input-dir', help='Root of cronet source') parser.add_option('--input-src-jar', help='Cronet api source jar') parser.add_option('--overview-file', help='Path of the overview page') parser.add_option('--readme-file', help='Path of the README.md') parser.add_option('--lib-java-dir', help='Directory containing java libs') options, _ = parser.parse_args() # A temporary directory to put the output of cronet api source jar files. unzipped_jar_path = tempfile.mkdtemp(dir=options.output_dir) if os.path.exists(options.input_src_jar): jar_cmd = ['jar', 'xf', os.path.abspath(options.input_src_jar)] build_utils.CheckOutput(jar_cmd, cwd=unzipped_jar_path) else: raise Exception('Jar file does not exist: %s' % options.input_src_jar) net_docs.ProcessDocs([options.readme_file], options.input_dir, options.output_dir, extensions=[CronetExtension()]) GenerateJavadoc(options, os.path.abspath(unzipped_jar_path)) if options.depfile: input_paths = [] for root, _, filenames in os.walk(options.input_dir): input_paths.extend(os.path.join(root, f) for f in filenames) build_utils.WriteDepfile( options.depfile, input_paths + build_utils.GetPythonDependencies()) # Clean up temporary output directory. build_utils.DeleteDirectory(unzipped_jar_path)
def JarSources(src_dir, jar_path): # The paths of the files in the jar will be the same as they are passed in to # the command. Because of this, the command should be run in # options.src_dir so the .java file paths in the jar are correct. jar_path = os.path.abspath(jar_path) jar_cmd = ['jar', 'cf', jar_path, '-C', src_dir, '.'] build_utils.CheckOutput(jar_cmd)
def GenerateJavadoc(options, src_dir, output_dir): working_dir = os.path.join(options.input_dir, 'android', 'api') overview_file = os.path.abspath(options.overview_file) android_sdk_jar = os.path.abspath(options.android_sdk_jar) if not android_sdk_jar: android_sdk_jar = os.path.join(SDK_DIR, 'platforms', 'android-27', 'android.jar') build_utils.DeleteDirectory(output_dir) build_utils.MakeDirectory(output_dir) javadoc_cmd = [ 'javadoc', '-d', output_dir, '-overview', overview_file, '-doclet', 'com.google.doclava.Doclava', '-docletpath', '%s:%s' % (os.path.join(DOCLAVA_DIR, 'jsilver.jar'), os.path.join(DOCLAVA_DIR, 'doclava.jar')), '-title', 'Cronet API', '-federate', 'Android', 'https://developer.android.com/', '-federationapi', 'Android', os.path.join(DOCLAVA_DIR, 'current.txt'), '-bootclasspath', '%s:%s' % (android_sdk_jar, os.path.join(SDK_DIR, 'extras', 'android', 'support', 'annotations', 'android-support-annotations.jar')), ] for subdir, _, files in os.walk(src_dir): for filename in files: if filename.endswith(".java"): javadoc_cmd += [os.path.join(subdir, filename)] try: build_utils.CheckOutput(javadoc_cmd, cwd=working_dir, fail_func=lambda ret, stderr: (ret != 0 or not stderr is '')) except build_utils.CalledProcessError: build_utils.DeleteDirectory(output_dir) raise # Create an index.html file at the root as this is the accepted format. # Do this by copying reference/index.html and adjusting the path. with open(os.path.join(output_dir, 'reference', 'index.html'), 'r') as \ old_index, open(os.path.join(output_dir, 'index.html'), 'w') as new_index: for line in old_index: new_index.write( line.replace('classes.html', os.path.join('reference', 'classes.html')))
def GenerateJavadoc(options): output_dir = os.path.abspath(os.path.join(options.output_dir, 'javadoc')) working_dir = os.path.join(options.input_dir, 'android/java') overview_file = os.path.abspath(options.overview_file) build_utils.DeleteDirectory(output_dir) build_utils.MakeDirectory(output_dir) javadoc_cmd = ['ant', '-Dsource.dir=src', '-Ddoc.dir=' + output_dir, '-Doverview=' + overview_file, 'doc'] build_utils.CheckOutput(javadoc_cmd, cwd=working_dir)
def ExtractJars(options): # The paths of the files in the jar will be the same as they are passed in to # the command. Because of this, the command should be run in # options.classes_dir so the .class file paths in the jar are correct. jar_cwd = options.classes_dir build_utils.DeleteDirectory(jar_cwd) build_utils.MakeDirectory(jar_cwd) for jar in build_utils.ParseGnList(options.jars): jar_path = os.path.abspath(jar) jar_cmd = ['jar', 'xf', jar_path] build_utils.CheckOutput(jar_cmd, cwd=jar_cwd)
def GenerateJavadoc(options): source_dir = options.source_dir output_dir = options.output_dir working_dir = options.working_dir build_utils.DeleteDirectory(output_dir) build_utils.MakeDirectory(output_dir) javadoc_cmd = [ 'ant', '-Dsource.dir=' + source_dir, '-Ddoc.dir=' + os.path.abspath(output_dir), 'doc' ] build_utils.CheckOutput(javadoc_cmd, cwd=working_dir)
def JarSources(src_dir, src_files, jar_path): # The paths of the files in the jar will be the same as they are passed in to # the command. Because of this, the command should be run in # options.src_dir so the .java file paths in the jar are correct. jar_cwd = src_dir jar_path = os.path.abspath(jar_path) if os.path.exists(jar_path): jar_cmd = ['jar', 'uf', jar_path] else: jar_cmd = ['jar', 'cf', jar_path] jar_cmd.extend(src_files) build_utils.CheckOutput(jar_cmd, cwd=jar_cwd)
def GenerateJavadoc(options): output_dir = os.path.abspath(os.path.join(options.output_dir, 'javadoc')) working_dir = os.path.join(options.input_dir, 'android/api') overview_file = os.path.abspath(options.overview_file) build_utils.DeleteDirectory(output_dir) build_utils.MakeDirectory(output_dir) javadoc_cmd = ['ant', '-Dsource.dir=src', '-Ddoc.dir=' + output_dir, '-Doverview=' + overview_file, 'doc'] stdout = build_utils.CheckOutput(javadoc_cmd, cwd=working_dir) if " error: " in stdout or "warning" in stdout: build_utils.DeleteDirectory(output_dir) raise build_utils.CalledProcessError(working_dir, javadoc_cmd, stdout)
def main(): parser = argparse.ArgumentParser() parser.add_argument('--classpath', required=True, action='append', help='What to use as javadoc\'s classpath. Can be ' 'specified multiple times.') parser.add_argument('--input-srcjar', help='Source JAR containing more files to process.') parser.add_argument('--java-files', required=True, help='Java files to process.') parser.add_argument('--output-dir', required=True, help='Directory to store the documentation.') parser.add_argument('--srcjar-files', help='When specified, only process the given files ' 'inside the srcjar set via --input-srcjar.') parser.add_argument('--stamp', required=True, help='File to touch on success.') options = parser.parse_args(build_utils.ExpandFileArgs(sys.argv[1:])) options.java_files = build_utils.ParseGypList(options.java_files) if options.srcjar_files and options.input_srcjar is None: print '--srcjar-files specified without --input-srcjar. Ignoring files.' with build_utils.TempDir() as temp_dir: java_files = options.java_files if options.input_srcjar: if options.srcjar_files: pattern = lambda f: f in options.srcjar_files java_files += [ os.path.join(temp_dir, f) for f in build_utils.ParseGypList(options.srcjar_files) ] else: pattern = None java_files += [os.path.join(temp_dir, '*.java')] build_utils.ExtractAll(options.input_srcjar, path=temp_dir) classpath = ':'.join(options.classpath) javadoc_cmd = [ 'javadoc', '-d', options.output_dir, '-classpath', classpath ] javadoc_cmd.extend(java_files) build_utils.CheckOutput(javadoc_cmd, print_stderr=True) build_utils.Touch(options.stamp)
def GenerateJavadoc(options, src_dir): output_dir = os.path.abspath(os.path.join(options.output_dir, 'javadoc')) working_dir = os.path.join(options.input_dir, 'android', 'api') overview_file = os.path.abspath(options.overview_file) android_sdk_jar = os.path.abspath(options.android_sdk_jar) if not android_sdk_jar: android_sdk_jar = os.path.join(SDK_DIR, 'platforms', 'android-27', 'android.jar') build_utils.DeleteDirectory(output_dir) build_utils.MakeDirectory(output_dir) javadoc_cmd = [ 'javadoc', '-d', output_dir, '-overview', overview_file, '-doclet', 'com.google.doclava.Doclava', '-docletpath', '%s:%s' % (os.path.join(DOCLAVA_DIR, 'jsilver.jar'), os.path.join(DOCLAVA_DIR, 'doclava.jar')), '-title', 'Cronet API', '-federate', 'Android', 'https://developer.android.com/', '-federationapi', 'Android', os.path.join(DOCLAVA_DIR, 'current.txt'), '-bootclasspath', '%s:%s' % (android_sdk_jar, os.path.join(SDK_DIR, 'extras', 'android', 'support', 'annotations', 'android-support-annotations.jar')), ] for subdir, _, files in os.walk(src_dir): for filename in files: if filename.endswith(".java"): javadoc_cmd += [os.path.join(subdir, filename)] try: build_utils.CheckOutput(javadoc_cmd, cwd=working_dir, fail_func=lambda ret, stderr: (ret != 0 or not stderr is '')) except build_utils.CalledProcessError: build_utils.DeleteDirectory(output_dir) raise
def main(): parser = optparse.OptionParser() build_utils.AddDepfileOption(parser) parser.add_option('--output-dir', help='Directory to put javadoc') parser.add_option('--input-dir', help='Root of cronet source') parser.add_option('--input-src-jar', help='Cronet api source jar') parser.add_option('--overview-file', help='Path of the overview page') parser.add_option('--readme-file', help='Path of the README.md') parser.add_option('--zip-file', help='Path to ZIP archive of javadocs.') parser.add_option('--android-sdk-jar', help='Path to android.jar') options, _ = parser.parse_args() # A temporary directory to put the output of cronet api source jar files. unzipped_jar_path = tempfile.mkdtemp(dir=options.output_dir) if os.path.exists(options.input_src_jar): jar_cmd = ['jar', 'xf', os.path.abspath(options.input_src_jar)] build_utils.CheckOutput(jar_cmd, cwd=unzipped_jar_path) else: raise Exception('Jar file does not exist: %s' % options.input_src_jar) net_docs.ProcessDocs([options.readme_file], options.input_dir, options.output_dir, extensions=[CronetExtension()]) output_dir = os.path.abspath(os.path.join(options.output_dir, 'javadoc')) GenerateJavadoc(options, os.path.abspath(unzipped_jar_path), output_dir) if options.zip_file: assert options.zip_file.endswith('.zip') shutil.make_archive(options.zip_file[:-4], 'zip', output_dir) if options.depfile: assert options.zip_file deps = [] for root, _, filenames in os.walk(options.input_dir): # Ignore .pyc files here, it might be re-generated during build. deps.extend( os.path.join(root, f) for f in filenames if not f.endswith('.pyc')) build_utils.WriteDepfile(options.depfile, options.zip_file, deps) # Clean up temporary output directory. build_utils.DeleteDirectory(unzipped_jar_path)
def GenerateJavadoc(options, src_dir): output_dir = os.path.abspath(os.path.join(options.output_dir, 'javadoc')) working_dir = os.path.join(options.input_dir, 'android/api') overview_file = os.path.abspath(options.overview_file) lib_java_dir = os.path.abspath(options.lib_java_dir) build_utils.DeleteDirectory(output_dir) build_utils.MakeDirectory(output_dir) javadoc_cmd = [ 'ant', '-Dsource.dir=' + src_dir, '-Ddoc.dir=' + output_dir, '-Dlib.java.dir=' + lib_java_dir, '-Doverview=' + overview_file, 'doc' ] stdout = build_utils.CheckOutput(javadoc_cmd, cwd=working_dir) for line in stdout.splitlines(): if " error: " in line or "javadoc: error " in line: build_utils.DeleteDirectory(output_dir) raise build_utils.CalledProcessError(working_dir, javadoc_cmd, stdout) # TODO(crbug.com/655666): remove compiler suppression warning once fixed. if ("warning" in line and not line.endswith('warnings') and not "the highest major version" in line): build_utils.DeleteDirectory(output_dir) raise build_utils.CalledProcessError(working_dir, javadoc_cmd, stdout)
def UnzipSourceJar(jar, unzipped_jar_path): if os.path.exists(jar): jar_cmd = ['jar', 'xf', os.path.abspath(jar)] build_utils.CheckOutput(jar_cmd, cwd=unzipped_jar_path) else: raise Exception('Jar file does not exist %s' % jar)
def BuildWithGradle(options): gradle_path = os.path.join(REPOSITORY_ROOT, 'third_party', 'gradle_wrapper', 'gradlew') gradle_cmd = [gradle_path, 'assembleDebug', 'assembleAndroidTest'] build_utils.CheckOutput(gradle_cmd, cwd=options.project_dir)