Mercurial > hg > truffle
comparison mxtool/mx.py @ 16839:7eca83fd5419
generate distributions for projects that define annotation processors
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Thu, 14 Aug 2014 23:45:15 +0200 |
parents | 22b2950a0613 |
children | 1fd7bb00a77f |
comparison
equal
deleted
inserted
replaced
16838:27f457a47a44 | 16839:7eca83fd5419 |
---|---|
238 self.javaCompliance = JavaCompliance(javaCompliance) if javaCompliance is not None else None | 238 self.javaCompliance = JavaCompliance(javaCompliance) if javaCompliance is not None else None |
239 self.native = False | 239 self.native = False |
240 self.workingSets = workingSets | 240 self.workingSets = workingSets |
241 self.dir = d | 241 self.dir = d |
242 | 242 |
243 # The annotation processors defined by this project | |
244 self.definedAnnotationProcessors = None | |
245 self.definedAnnotationProcessorsDist = None | |
246 | |
247 | |
243 # Verify that a JDK exists for this project if its compliance level is | 248 # Verify that a JDK exists for this project if its compliance level is |
244 # less than the compliance level of the default JDK | 249 # less than the compliance level of the default JDK |
245 jdk = java(self.javaCompliance) | 250 jdk = java(self.javaCompliance) |
246 if jdk is None and self.javaCompliance < java().javaCompliance: | 251 if jdk is None and self.javaCompliance < java().javaCompliance: |
247 abort('Cannot find ' + str(self.javaCompliance) + ' JDK required by ' + name + '. ' + | 252 abort('Cannot find ' + str(self.javaCompliance) + ' JDK required by ' + name + '. ' + |
439 """Get the immutable set of Java packages defined by other Java projects that are | 444 """Get the immutable set of Java packages defined by other Java projects that are |
440 imported by the Java sources of this project.""" | 445 imported by the Java sources of this project.""" |
441 self._init_packages_and_imports() | 446 self._init_packages_and_imports() |
442 return self._imported_java_packages | 447 return self._imported_java_packages |
443 | 448 |
449 """ | |
450 Gets the list of projects defining the annotation processors that will be applied | |
451 when compiling this project. This includes the projects declared by the annotationProcessors property | |
452 of this project and any of its project dependencies. It also includes | |
453 any project dependencies that define an annotation processors. | |
454 """ | |
444 def annotation_processors(self): | 455 def annotation_processors(self): |
445 if not hasattr(self, '_annotationProcessors'): | 456 if not hasattr(self, '_annotationProcessors'): |
446 ap = set() | 457 aps = set() |
447 if hasattr(self, '_declaredAnnotationProcessors'): | 458 if hasattr(self, '_declaredAnnotationProcessors'): |
448 ap = set(self._declaredAnnotationProcessors) | 459 aps = set(self._declaredAnnotationProcessors) |
449 | 460 for ap in aps: |
450 # find dependencies that auto-inject themselves as annotation processors to all dependents | 461 if project(ap).definedAnnotationProcessorsDist is None: |
462 abort('Project ' + ap + ' declared in annotationProcessors property of ' + self.name + ' does not define any annotation processors') | |
463 | |
451 allDeps = self.all_deps([], includeLibs=False, includeSelf=False, includeAnnotationProcessors=False) | 464 allDeps = self.all_deps([], includeLibs=False, includeSelf=False, includeAnnotationProcessors=False) |
452 for p in allDeps: | 465 for p in allDeps: |
453 if hasattr(p, 'annotationProcessorForDependents') and p.annotationProcessorForDependents.lower() == 'true': | 466 # Add an annotation processor dependency |
454 ap.add(p.name) | 467 if p.definedAnnotationProcessorsDist is not None: |
455 self._annotationProcessors = list(ap) | 468 aps.add(p.name) |
469 | |
470 # Inherit annotation processors from dependencies | |
471 aps.update(p.annotation_processors()) | |
472 | |
473 self._annotationProcessors = list(aps) | |
456 return self._annotationProcessors | 474 return self._annotationProcessors |
475 | |
476 """ | |
477 Gets the class path composed of the distribution jars containing the | |
478 annotation processors that will be applied when compiling this project. | |
479 """ | |
480 def annotation_processors_path(self): | |
481 aps = [project(ap) for ap in self.annotation_processors()] | |
482 if len(aps): | |
483 return os.pathsep.join([ap.definedAnnotationProcessorsDist.path for ap in aps if ap.definedAnnotationProcessorsDist]) | |
484 return None | |
457 | 485 |
458 def update_current_annotation_processors_file(self): | 486 def update_current_annotation_processors_file(self): |
459 aps = self.annotation_processors() | 487 aps = self.annotation_processors() |
460 outOfDate = False | 488 outOfDate = False |
461 currentApsFile = join(self.suite.mxDir, 'currentAnnotationProcessors', self.name) | 489 currentApsFile = join(self.suite.mxDir, 'currentAnnotationProcessors', self.name) |
831 | 859 |
832 for name, attrs in projsMap.iteritems(): | 860 for name, attrs in projsMap.iteritems(): |
833 srcDirs = pop_list(attrs, 'sourceDirs') | 861 srcDirs = pop_list(attrs, 'sourceDirs') |
834 deps = pop_list(attrs, 'dependencies') | 862 deps = pop_list(attrs, 'dependencies') |
835 ap = pop_list(attrs, 'annotationProcessors') | 863 ap = pop_list(attrs, 'annotationProcessors') |
836 # deps += ap | |
837 javaCompliance = attrs.pop('javaCompliance', None) | 864 javaCompliance = attrs.pop('javaCompliance', None) |
838 subDir = attrs.pop('subDir', None) | 865 subDir = attrs.pop('subDir', None) |
839 if subDir is None: | 866 if subDir is None: |
840 d = join(self.dir, name) | 867 d = join(self.dir, name) |
841 else: | 868 else: |
880 exclDeps = pop_list(attrs, 'exclude') | 907 exclDeps = pop_list(attrs, 'exclude') |
881 distDeps = pop_list(attrs, 'distDependencies') | 908 distDeps = pop_list(attrs, 'distDependencies') |
882 d = Distribution(self, name, path, sourcesPath, deps, mainClass, exclDeps, distDeps) | 909 d = Distribution(self, name, path, sourcesPath, deps, mainClass, exclDeps, distDeps) |
883 d.__dict__.update(attrs) | 910 d.__dict__.update(attrs) |
884 self.dists.append(d) | 911 self.dists.append(d) |
912 | |
913 # Create a distribution for each project that defines annotation processors | |
914 for p in self.projects: | |
915 annotationProcessors = None | |
916 for srcDir in p.source_dirs(): | |
917 configFile = join(srcDir, 'META-INF', 'services', 'javax.annotation.processing.Processor') | |
918 if exists(configFile): | |
919 with open(configFile) as fp: | |
920 annotationProcessors = [ap.strip() for ap in fp] | |
921 if len(annotationProcessors) != 0: | |
922 for ap in annotationProcessors: | |
923 if not ap.startswith(p.name): | |
924 abort(ap + ' in ' + configFile + ' does not start with ' + p.name) | |
925 if annotationProcessors: | |
926 dname = p.name.replace('.', '_').upper() | |
927 apDir = join(p.dir, 'ap') | |
928 path = join(apDir, p.name + '.jar') | |
929 sourcesPath = None | |
930 deps = [p.name] | |
931 mainClass = None | |
932 exclDeps = [] | |
933 distDeps = [] | |
934 d = Distribution(self, dname, path, sourcesPath, deps, mainClass, exclDeps, distDeps) | |
935 d.subDir = os.path.relpath(os.path.dirname(p.dir), self.dir) | |
936 self.dists.append(d) | |
937 p.definedAnnotationProcessors = annotationProcessors | |
938 p.definedAnnotationProcessorsDist = d | |
939 d.definingProject = p | |
940 | |
941 # Restrict exported annotation processors to those explicitly defined by the project | |
942 def _refineAnnotationProcessorServiceConfig(dist): | |
943 aps = dist.definingProject.definedAnnotationProcessors | |
944 apsJar = dist.path | |
945 config = 'META-INF/services/javax.annotation.processing.Processor' | |
946 with zipfile.ZipFile(apsJar, 'r') as zf: | |
947 currentAps = zf.read(config).split() | |
948 if currentAps != aps: | |
949 logv('[updating ' + config + ' in ' + apsJar + ']') | |
950 with Archiver(apsJar) as arc, zipfile.ZipFile(apsJar, 'r') as lp: | |
951 for arcname in lp.namelist(): | |
952 if arcname == config: | |
953 arc.zf.writestr(arcname, '\n'.join(aps)) | |
954 else: | |
955 arc.zf.writestr(arcname, lp.read(arcname)) | |
956 d.add_update_listener(_refineAnnotationProcessorServiceConfig) | |
885 | 957 |
886 if self.name is None: | 958 if self.name is None: |
887 abort('Missing "suite=<name>" in ' + projectsFile) | 959 abort('Missing "suite=<name>" in ' + projectsFile) |
888 | 960 |
889 def _commands_name(self): | 961 def _commands_name(self): |
2051 argfile.write('\n'.join(self.javafilelist)) | 2123 argfile.write('\n'.join(self.javafilelist)) |
2052 argfile.close() | 2124 argfile.close() |
2053 | 2125 |
2054 processorArgs = [] | 2126 processorArgs = [] |
2055 | 2127 |
2056 aps = self.proj.annotation_processors() | 2128 processorPath = self.proj.annotation_processors_path() |
2057 if len(aps) > 0: | 2129 if processorPath: |
2058 processorPath = classpath(aps, resolve=True) | |
2059 genDir = self.proj.source_gen_dir() | 2130 genDir = self.proj.source_gen_dir() |
2060 if exists(genDir): | 2131 if exists(genDir): |
2061 shutil.rmtree(genDir) | 2132 shutil.rmtree(genDir) |
2062 os.mkdir(genDir) | 2133 os.mkdir(genDir) |
2063 processorArgs += ['-processorpath', join(processorPath), '-s', genDir] | 2134 processorArgs += ['-processorpath', join(processorPath), '-s', genDir] |
2132 else: | 2203 else: |
2133 jdtArgs += ['-properties', jdtProperties] | 2204 jdtArgs += ['-properties', jdtProperties] |
2134 jdtArgs.append('@' + argfile.name) | 2205 jdtArgs.append('@' + argfile.name) |
2135 | 2206 |
2136 run_java(jdtVmArgs + jdtArgs) | 2207 run_java(jdtVmArgs + jdtArgs) |
2208 | |
2209 # Create annotation processor jar for a project that defines annotation processors | |
2210 if self.proj.definedAnnotationProcessorsDist: | |
2211 self.proj.definedAnnotationProcessorsDist.make_archive() | |
2212 | |
2137 finally: | 2213 finally: |
2138 for n in toBeDeleted: | 2214 for n in toBeDeleted: |
2139 os.remove(n) | 2215 os.remove(n) |
2140 self.done = True | 2216 self.done = True |
2141 | 2217 |
2196 projects = _projects_opt_limit_to_suites(projects_from_names(projectNames)) | 2272 projects = _projects_opt_limit_to_suites(projects_from_names(projectNames)) |
2197 # N.B. Limiting to a suite only affects the starting set of projects. Dependencies in other suites will still be compiled | 2273 # N.B. Limiting to a suite only affects the starting set of projects. Dependencies in other suites will still be compiled |
2198 sortedProjects = sorted_project_deps(projects, includeAnnotationProcessors=True) | 2274 sortedProjects = sorted_project_deps(projects, includeAnnotationProcessors=True) |
2199 | 2275 |
2200 if args.java: | 2276 if args.java: |
2201 ideinit([], refreshOnly=True, buildProcessorJars=False) | 2277 ideinit([], refreshOnly=True) |
2202 | 2278 |
2203 def prepareOutputDirs(p, clean): | 2279 def prepareOutputDirs(p, clean): |
2204 outputDir = p.output_dir() | 2280 outputDir = p.output_dir() |
2205 if exists(outputDir): | 2281 if exists(outputDir): |
2206 if clean: | 2282 if clean: |
2215 for f in os.listdir(genDir): | 2291 for f in os.listdir(genDir): |
2216 shutil.rmtree(join(genDir, f)) | 2292 shutil.rmtree(join(genDir, f)) |
2217 return outputDir | 2293 return outputDir |
2218 | 2294 |
2219 tasks = {} | 2295 tasks = {} |
2296 updatedAnnotationProcessorDists = set() | |
2220 for p in sortedProjects: | 2297 for p in sortedProjects: |
2221 if p.native: | 2298 if p.native: |
2222 if args.native: | 2299 if args.native: |
2223 log('Calling GNU make {0}...'.format(p.dir)) | 2300 log('Calling GNU make {0}...'.format(p.dir)) |
2224 | 2301 |
2315 if len(javafilelist) == 0: | 2392 if len(javafilelist) == 0: |
2316 logv('[no Java sources for {0} - skipping]'.format(p.name)) | 2393 logv('[no Java sources for {0} - skipping]'.format(p.name)) |
2317 continue | 2394 continue |
2318 | 2395 |
2319 task = JavaCompileTask(args, p, buildReason, javafilelist, jdk, outputDir, jdtJar, taskDeps) | 2396 task = JavaCompileTask(args, p, buildReason, javafilelist, jdk, outputDir, jdtJar, taskDeps) |
2397 if p.definedAnnotationProcessorsDist: | |
2398 updatedAnnotationProcessorDists.add(p.definedAnnotationProcessorsDist) | |
2320 | 2399 |
2321 if args.parallelize: | 2400 if args.parallelize: |
2322 # Best to initialize class paths on main process | 2401 # Best to initialize class paths on main process |
2323 jdk.bootclasspath() | 2402 jdk.bootclasspath() |
2324 task.proc = None | 2403 task.proc = None |
2416 for t in failed: | 2495 for t in failed: |
2417 log('Compiling {} failed'.format(t.proj.name)) | 2496 log('Compiling {} failed'.format(t.proj.name)) |
2418 abort('{} Java compilation tasks failed'.format(len(failed))) | 2497 abort('{} Java compilation tasks failed'.format(len(failed))) |
2419 | 2498 |
2420 for dist in sorted_dists(): | 2499 for dist in sorted_dists(): |
2421 archive(['@' + dist.name]) | 2500 if dist not in updatedAnnotationProcessorDists: |
2501 archive(['@' + dist.name]) | |
2422 | 2502 |
2423 if suppliedParser: | 2503 if suppliedParser: |
2424 return args | 2504 return args |
2425 return None | 2505 return None |
2426 | 2506 |
2481 if not os.path.isfile(args.eclipse_exe): | 2561 if not os.path.isfile(args.eclipse_exe): |
2482 abort('File does not exist: ' + args.eclipse_exe) | 2562 abort('File does not exist: ' + args.eclipse_exe) |
2483 if not os.access(args.eclipse_exe, os.X_OK): | 2563 if not os.access(args.eclipse_exe, os.X_OK): |
2484 abort('Not an executable file: ' + args.eclipse_exe) | 2564 abort('Not an executable file: ' + args.eclipse_exe) |
2485 | 2565 |
2486 eclipseinit([], buildProcessorJars=False) | 2566 eclipseinit([]) |
2487 | 2567 |
2488 # build list of projects to be processed | 2568 # build list of projects to be processed |
2489 projects = sorted_deps() | 2569 projects = sorted_deps() |
2490 if args.projects is not None: | 2570 if args.projects is not None: |
2491 projects = [project(name) for name in args.projects.split(',')] | 2571 projects = [project(name) for name in args.projects.split(',')] |
2591 if args.backup: | 2671 if args.backup: |
2592 zf.close() | 2672 zf.close() |
2593 log('Wrote backup of {0} modified files to {1}'.format(len(modified), backup)) | 2673 log('Wrote backup of {0} modified files to {1}'.format(len(modified), backup)) |
2594 return 1 | 2674 return 1 |
2595 return 0 | 2675 return 0 |
2596 | |
2597 def processorjars(): | |
2598 for s in suites(True): | |
2599 _processorjars_suite(s) | |
2600 | |
2601 def _processorjars_suite(s): | |
2602 projs = set() | |
2603 candidates = sorted_project_deps(s.projects) | |
2604 for p in candidates: | |
2605 if _isAnnotationProcessorDependency(p): | |
2606 projs.add(p) | |
2607 | |
2608 if len(projs) <= 0: | |
2609 return [] | |
2610 | |
2611 pnames = [p.name for p in projs] | |
2612 build(['--jdt-warning-as-error', '--projects', ",".join(pnames)]) | |
2613 return archive(pnames) | |
2614 | 2676 |
2615 def pylint(args): | 2677 def pylint(args): |
2616 """run pylint (if available) over Python source files (found by 'hg locate' or by tree walk with -walk)""" | 2678 """run pylint (if available) over Python source files (found by 'hg locate' or by tree walk with -walk)""" |
2617 | 2679 |
2618 parser = ArgumentParser(prog='mx pylint') | 2680 parser = ArgumentParser(prog='mx pylint') |
2955 if get_os() == 'windows': | 3017 if get_os() == 'windows': |
2956 path = unicode("\\\\?\\" + dirPath) | 3018 path = unicode("\\\\?\\" + dirPath) |
2957 shutil.rmtree(path) | 3019 shutil.rmtree(path) |
2958 | 3020 |
2959 def _rmIfExists(name): | 3021 def _rmIfExists(name): |
2960 if os.path.isfile(name): | 3022 if name and os.path.isfile(name): |
2961 os.unlink(name) | 3023 os.unlink(name) |
2962 | 3024 |
2963 for p in projects_opt_limit_to_suites(): | 3025 for p in projects_opt_limit_to_suites(): |
2964 if p.native: | 3026 if p.native: |
2965 if args.native: | 3027 if args.native: |
3217 eclipseLaunches = join('mx', 'eclipse-launches') | 3279 eclipseLaunches = join('mx', 'eclipse-launches') |
3218 if not exists(eclipseLaunches): | 3280 if not exists(eclipseLaunches): |
3219 os.makedirs(eclipseLaunches) | 3281 os.makedirs(eclipseLaunches) |
3220 return update_file(join(eclipseLaunches, name + '.launch'), launch) | 3282 return update_file(join(eclipseLaunches, name + '.launch'), launch) |
3221 | 3283 |
3222 def eclipseinit(args, buildProcessorJars=True, refreshOnly=False): | 3284 def eclipseinit(args, refreshOnly=False): |
3223 """(re)generate Eclipse project configurations and working sets""" | 3285 """(re)generate Eclipse project configurations and working sets""" |
3224 for s in suites(True): | 3286 for s in suites(True): |
3225 _eclipseinit_suite(args, s, buildProcessorJars, refreshOnly) | 3287 _eclipseinit_suite(args, s, refreshOnly) |
3226 | 3288 |
3227 generate_eclipse_workingsets() | 3289 generate_eclipse_workingsets() |
3228 | 3290 |
3229 def _check_ide_timestamp(suite, configZip, ide): | 3291 def _check_ide_timestamp(suite, configZip, ide): |
3230 """return True if and only if the projects file, eclipse-settings files, and mx itself are all older than configZip""" | 3292 """return True if and only if the projects file, eclipse-settings files, and mx itself are all older than configZip""" |
3380 out.open('buildCommand') | 3442 out.open('buildCommand') |
3381 out.element('name', data=buildCommand) | 3443 out.element('name', data=buildCommand) |
3382 out.element('arguments', data='') | 3444 out.element('arguments', data='') |
3383 out.close('buildCommand') | 3445 out.close('buildCommand') |
3384 | 3446 |
3385 # The path should always be p.name/dir. independent of where the workspace actually is. | |
3386 # So we use the parent folder of the project, whatever that is, to generate such a relative path. | |
3387 logicalWorkspaceRoot = os.path.dirname(p.dir) | |
3388 binFolder = os.path.relpath(p.output_dir(), logicalWorkspaceRoot) | |
3389 | |
3390 if _isAnnotationProcessorDependency(p): | |
3391 refreshFile = os.path.relpath(join(p.dir, p.name + '.jar'), logicalWorkspaceRoot) | |
3392 _genEclipseBuilder(out, p, 'Jar', 'archive ' + p.name, refresh=True, refreshFile=refreshFile, relevantResources=[binFolder], async=True, xmlIndent='', xmlStandalone='no') | |
3393 | |
3394 out.close('buildSpec') | 3447 out.close('buildSpec') |
3395 out.open('natures') | 3448 out.open('natures') |
3396 out.element('nature', data='org.eclipse.jdt.core.javanature') | 3449 out.element('nature', data='org.eclipse.jdt.core.javanature') |
3397 if exists(csConfig): | 3450 if exists(csConfig): |
3398 out.element('nature', data='net.sf.eclipsecs.core.CheckstyleNature') | 3451 out.element('nature', data='net.sf.eclipsecs.core.CheckstyleNature') |
3444 content = content.replace('org.eclipse.jdt.core.compiler.processAnnotations=disabled', 'org.eclipse.jdt.core.compiler.processAnnotations=enabled') | 3497 content = content.replace('org.eclipse.jdt.core.compiler.processAnnotations=disabled', 'org.eclipse.jdt.core.compiler.processAnnotations=enabled') |
3445 update_file(join(settingsDir, name), content) | 3498 update_file(join(settingsDir, name), content) |
3446 if files: | 3499 if files: |
3447 files.append(join(settingsDir, name)) | 3500 files.append(join(settingsDir, name)) |
3448 | 3501 |
3449 if len(p.annotation_processors()) > 0: | 3502 processorPath = p.annotation_processors_path() |
3503 if processorPath: | |
3450 out = XMLDoc() | 3504 out = XMLDoc() |
3451 out.open('factorypath') | 3505 out.open('factorypath') |
3452 out.element('factorypathentry', {'kind' : 'PLUGIN', 'id' : 'org.eclipse.jst.ws.annotations.core', 'enabled' : 'true', 'runInBatchMode' : 'false'}) | 3506 out.element('factorypathentry', {'kind' : 'PLUGIN', 'id' : 'org.eclipse.jst.ws.annotations.core', 'enabled' : 'true', 'runInBatchMode' : 'false'}) |
3453 for ap in p.annotation_processors(): | 3507 for e in processorPath.split(os.pathsep): |
3454 for dep in dependency(ap).all_deps([], True): | 3508 out.element('factorypathentry', {'kind' : 'EXTJAR', 'id' : e, 'enabled' : 'true', 'runInBatchMode' : 'false'}) |
3455 if dep.isLibrary(): | |
3456 # Relative paths for "lib" class path entries have various semantics depending on the Eclipse | |
3457 # version being used (e.g. see https://bugs.eclipse.org/bugs/show_bug.cgi?id=274737) so it's | |
3458 # safest to simply use absolute paths. | |
3459 path = _make_absolute(dep.get_path(resolve=True), p.suite.dir) | |
3460 out.element('factorypathentry', {'kind' : 'EXTJAR', 'id' : path, 'enabled' : 'true', 'runInBatchMode' : 'false'}) | |
3461 if files: | |
3462 files.append(path) | |
3463 elif dep.isProject(): | |
3464 out.element('factorypathentry', {'kind' : 'WKSPJAR', 'id' : '/' + dep.name + '/' + dep.name + '.jar', 'enabled' : 'true', 'runInBatchMode' : 'false'}) | |
3465 out.close('factorypath') | 3509 out.close('factorypath') |
3466 update_file(join(p.dir, '.factorypath'), out.xml(indent='\t', newl='\n')) | 3510 update_file(join(p.dir, '.factorypath'), out.xml(indent='\t', newl='\n')) |
3467 if files: | 3511 if files: |
3468 files.append(join(p.dir, '.factorypath')) | 3512 files.append(join(p.dir, '.factorypath')) |
3469 | 3513 |
3470 def _eclipseinit_suite(args, suite, buildProcessorJars=True, refreshOnly=False): | 3514 def _eclipseinit_suite(args, suite, refreshOnly=False): |
3471 configZip = TimeStampFile(join(suite.mxDir, 'eclipse-config.zip')) | 3515 configZip = TimeStampFile(join(suite.mxDir, 'eclipse-config.zip')) |
3472 configLibsZip = join(suite.mxDir, 'eclipse-config-libs.zip') | 3516 configLibsZip = join(suite.mxDir, 'eclipse-config-libs.zip') |
3473 if refreshOnly and not configZip.exists(): | 3517 if refreshOnly and not configZip.exists(): |
3474 return | 3518 return |
3475 | 3519 |
3479 | 3523 |
3480 | 3524 |
3481 | 3525 |
3482 files = [] | 3526 files = [] |
3483 libFiles = [] | 3527 libFiles = [] |
3484 if buildProcessorJars: | |
3485 files += _processorjars_suite(suite) | |
3486 | 3528 |
3487 for p in suite.projects: | 3529 for p in suite.projects: |
3488 if p.native: | 3530 if p.native: |
3489 continue | 3531 continue |
3490 _eclipseinit_project(p) | 3532 _eclipseinit_project(p) |
3550 os.chmod(zipPath, 0o666 & ~currentUmask) | 3592 os.chmod(zipPath, 0o666 & ~currentUmask) |
3551 finally: | 3593 finally: |
3552 if exists(tmp): | 3594 if exists(tmp): |
3553 os.remove(tmp) | 3595 os.remove(tmp) |
3554 | 3596 |
3555 def _isAnnotationProcessorDependency(p): | |
3556 """ | |
3557 Determines if a given project is part of an annotation processor. | |
3558 """ | |
3559 return p in sorted_deps(annotation_processors()) | |
3560 | |
3561 def _genEclipseBuilder(dotProjectDoc, p, name, mxCommand, refresh=True, refreshFile=None, relevantResources=None, async=False, logToConsole=False, logToFile=False, appendToLogFile=True, xmlIndent='\t', xmlStandalone=None): | 3597 def _genEclipseBuilder(dotProjectDoc, p, name, mxCommand, refresh=True, refreshFile=None, relevantResources=None, async=False, logToConsole=False, logToFile=False, appendToLogFile=True, xmlIndent='\t', xmlStandalone=None): |
3562 externalToolDir = join(p.dir, '.externalToolBuilders') | 3598 externalToolDir = join(p.dir, '.externalToolBuilders') |
3563 launchOut = XMLDoc() | 3599 launchOut = XMLDoc() |
3564 consoleOn = 'true' if logToConsole else 'false' | 3600 consoleOn = 'true' if logToConsole else 'false' |
3565 launchOut.open('launchConfiguration', {'type' : 'org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType'}) | 3601 launchOut.open('launchConfiguration', {'type' : 'org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType'}) |
3792 wsdoc.open('workingSet', {'editPageID': 'org.eclipse.jdt.ui.JavaWorkingSetPage', 'factoryID': 'org.eclipse.ui.internal.WorkingSetFactory', 'id': 'wsid_' + ws, 'label': ws, 'name': ws}) | 3828 wsdoc.open('workingSet', {'editPageID': 'org.eclipse.jdt.ui.JavaWorkingSetPage', 'factoryID': 'org.eclipse.ui.internal.WorkingSetFactory', 'id': 'wsid_' + ws, 'label': ws, 'name': ws}) |
3793 | 3829 |
3794 def _workingset_element(wsdoc, p): | 3830 def _workingset_element(wsdoc, p): |
3795 wsdoc.element('item', {'elementID': '=' + p, 'factoryID': 'org.eclipse.jdt.ui.PersistableJavaElementFactory'}) | 3831 wsdoc.element('item', {'elementID': '=' + p, 'factoryID': 'org.eclipse.jdt.ui.PersistableJavaElementFactory'}) |
3796 | 3832 |
3797 def netbeansinit(args, refreshOnly=False, buildProcessorJars=True): | 3833 def netbeansinit(args, refreshOnly=False): |
3798 """(re)generate NetBeans project configurations""" | 3834 """(re)generate NetBeans project configurations""" |
3799 | 3835 |
3800 for suite in suites(True): | 3836 for suite in suites(True): |
3801 _netbeansinit_suite(args, suite, refreshOnly, buildProcessorJars) | 3837 _netbeansinit_suite(args, suite, refreshOnly) |
3802 | 3838 |
3803 def _netbeansinit_suite(args, suite, refreshOnly=False, buildProcessorJars=True): | 3839 def _netbeansinit_suite(args, suite, refreshOnly=False): |
3804 configZip = TimeStampFile(join(suite.mxDir, 'netbeans-config.zip')) | 3840 configZip = TimeStampFile(join(suite.mxDir, 'netbeans-config.zip')) |
3805 configLibsZip = join(suite.mxDir, 'eclipse-config-libs.zip') | 3841 configLibsZip = join(suite.mxDir, 'eclipse-config-libs.zip') |
3806 if refreshOnly and not configZip.exists(): | 3842 if refreshOnly and not configZip.exists(): |
3807 return | 3843 return |
3808 | 3844 |
4252 rm(join(p.dir, p.name + '.jar')) | 4288 rm(join(p.dir, p.name + '.jar')) |
4253 except: | 4289 except: |
4254 log("Error removing {0}".format(p.name + '.jar')) | 4290 log("Error removing {0}".format(p.name + '.jar')) |
4255 | 4291 |
4256 | 4292 |
4257 def ideinit(args, refreshOnly=False, buildProcessorJars=True): | 4293 def ideinit(args, refreshOnly=False): |
4258 """(re)generate Eclipse, NetBeans and Intellij project configurations""" | 4294 """(re)generate Eclipse, NetBeans and Intellij project configurations""" |
4259 eclipseinit(args, refreshOnly=refreshOnly, buildProcessorJars=buildProcessorJars) | 4295 eclipseinit(args, refreshOnly=refreshOnly) |
4260 netbeansinit(args, refreshOnly=refreshOnly, buildProcessorJars=buildProcessorJars) | 4296 netbeansinit(args, refreshOnly=refreshOnly) |
4261 intellijinit(args, refreshOnly=refreshOnly) | 4297 intellijinit(args, refreshOnly=refreshOnly) |
4262 if not refreshOnly: | 4298 if not refreshOnly: |
4263 fsckprojects([]) | 4299 fsckprojects([]) |
4264 | 4300 |
4265 def fsckprojects(args): | 4301 def fsckprojects(args): |