mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
Bug 973807 - Fixes to AndroidEclipse build backend. r=me
Largest changes: run mach less frequently and add build logging.
This commit is contained in:
parent
2d583fd28f
commit
dd3e43e814
@ -502,13 +502,15 @@ main.recursive_make_targets += [OBJDIR + '/generated/' + f for f in mgjar.genera
|
||||
main.recursive_make_targets += [OBJDIR + '/generated/' + f for f in gbjar.generated_sources]
|
||||
|
||||
main.included_projects += ['../' + generated.name, '../' + branding.name]
|
||||
main.referenced_projects += [generated.name, branding.name]
|
||||
main.extra_jars += [CONFIG['ANDROID_COMPAT_LIB']]
|
||||
main.assets = TOPOBJDIR + '/dist/fennec/assets'
|
||||
main.libs = TOPOBJDIR + '/dist/fennec/lib'
|
||||
|
||||
cpe = main.add_classpathentry('src', SRCDIR,
|
||||
dstdir='src/org/mozilla/gecko',
|
||||
exclude_patterns=['org/mozilla/gecko/tests/**'])
|
||||
exclude_patterns=['org/mozilla/gecko/tests/**',
|
||||
'org/mozilla/gecko/resources/**'])
|
||||
if not CONFIG['MOZ_CRASHREPORTER']:
|
||||
cpe.exclude_patterns += ['org/mozilla/gecko/CrashReporter.java']
|
||||
main.add_classpathentry('generated', OBJDIR + '/generated',
|
||||
|
@ -106,13 +106,12 @@ class AndroidEclipseBackend(CommonBackend):
|
||||
|
||||
def _Element_for_extra_jar(self, name):
|
||||
"""Turn a referenced JAR name into an XML Element, like:
|
||||
<classpathentry kind="lib" path="libs/robotium-solo-4.3.1.jar"/>
|
||||
<classpathentry exported="true" kind="lib" path="/Users/nalexander/Mozilla/gecko-dev/build/mobile/robocop/robotium-solo-4.3.1.jar"/>
|
||||
"""
|
||||
e = ET.Element('classpathentry')
|
||||
e.set('kind', 'lib')
|
||||
# All project directories are in the same root; this
|
||||
# reference is absolute in the Eclipse namespace.
|
||||
e.set('path', 'libs/' + name)
|
||||
e.set('exported', 'true')
|
||||
e.set('path', name)
|
||||
return e
|
||||
|
||||
def _manifest_for_project(self, srcdir, project):
|
||||
@ -130,17 +129,18 @@ class AndroidEclipseBackend(CommonBackend):
|
||||
for cpe in project._classpathentries:
|
||||
manifest.add_symlink(mozpath.join(srcdir, cpe.srcdir), cpe.dstdir)
|
||||
|
||||
# JARs and native libraries go in the same place. This
|
||||
# wouldn't be a problem, except we only know the contents of
|
||||
# (a subdirectory of) libs/ after a successful build and
|
||||
# package, which is after build-backend time. So we use a
|
||||
# pattern symlink that is resolved at manifest install time.
|
||||
# JARs and native libraries go in the same place. For now,
|
||||
# we're adding class path entries with the full path to
|
||||
# required JAR files (which makes sense for JARs in the source
|
||||
# directory, but probably doesn't for JARs in the object
|
||||
# directory). This could be a problem because we only know
|
||||
# the contents of (a subdirectory of) libs/ after a successful
|
||||
# build and package, which is after build-backend time. So we
|
||||
# use a pattern symlink that is resolved at manifest install
|
||||
# time.
|
||||
if project.libs:
|
||||
manifest.add_pattern_copy(mozpath.join(srcdir, project.libs), '**', 'libs')
|
||||
|
||||
for extra_jar in sorted(project.extra_jars):
|
||||
manifest.add_copy(mozpath.join(srcdir, extra_jar), mozpath.join('libs', os.path.basename(extra_jar)))
|
||||
|
||||
return manifest
|
||||
|
||||
def _process_android_eclipse_project_data(self, data, srcdir, objdir):
|
||||
@ -166,7 +166,7 @@ class AndroidEclipseBackend(CommonBackend):
|
||||
classpathentries.append(ET.tostring(e))
|
||||
|
||||
for name in sorted(data.extra_jars):
|
||||
e = self._Element_for_extra_jar(os.path.basename(name))
|
||||
e = self._Element_for_extra_jar(mozpath.join(srcdir, name))
|
||||
classpathentries.append(ET.tostring(e))
|
||||
|
||||
defines = {}
|
||||
|
@ -2,17 +2,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
|
||||
<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_AUTO_TARGETS" value="compile,"/>
|
||||
<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_CLEAN_TARGETS" value="compile,"/>
|
||||
<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_MANUAL_TARGETS" value="compile,"/>
|
||||
<booleanAttribute key="org.eclipse.ant.ui.ATTR_TARGETS_UPDATED" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.ant.ui.DEFAULT_VM_INSTALL" value="false"/>
|
||||
<booleanAttribute key="org.eclipse.debug.core.capture_output" value="true"/>
|
||||
<booleanAttribute key="org.eclipse.debug.ui.ATTR_CONSOLE_OUTPUT_ON" value="true"/>
|
||||
<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${project}"/>
|
||||
<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/>
|
||||
<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="true"/>
|
||||
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="@IDE_PROJECT_NAME@"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:/@IDE_PROJECT_NAME@/build.xml}"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="incremental,auto,clean"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="incremental,auto"/>
|
||||
<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
|
||||
<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-Dbuild_type="${build_type}" -Dbuild_files="DUMMY ${build_files}""/>
|
||||
</launchConfiguration>
|
||||
|
@ -1,12 +1,76 @@
|
||||
#filter substitution
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project>
|
||||
<target name="compile">
|
||||
<property name="topsrcdir" value="@IDE_TOPSRCDIR@"/>
|
||||
<property name="topobjdir" value="@IDE_TOPOBJDIR@"/>
|
||||
<property name="objdir" value="@IDE_OBJDIR@"/>
|
||||
<property name="project_name" value="@IDE_PROJECT_NAME@"/>
|
||||
<property name="topsrcdir" value="@IDE_TOPSRCDIR@"/>
|
||||
<property name="topobjdir" value="@IDE_TOPOBJDIR@"/>
|
||||
<property name="objdir" value="@IDE_OBJDIR@"/>
|
||||
<property name="project_name" value="@IDE_PROJECT_NAME@"/>
|
||||
|
||||
// This file can get large (!), but for a short time we want to
|
||||
// log as much information for debugging build loops as possible.
|
||||
<record name="${topobjdir}/android_eclipse/build.log" append="yes" />
|
||||
|
||||
<target name="build_needed" >
|
||||
|
||||
<script language="javascript" >
|
||||
<![CDATA[
|
||||
importClass(java.io.File);
|
||||
|
||||
var build_files = project.getProperty("build_files").split(" ");
|
||||
var after = [];
|
||||
|
||||
var echo = project.createTask("echo");
|
||||
var info = Packages.org.apache.tools.ant.taskdefs.Echo.EchoLevel();
|
||||
info.setValue("info");
|
||||
echo.setLevel(info);
|
||||
|
||||
// Timestamp.
|
||||
echo.addText(project.getProperty("project_name") + " build type " + project.getProperty("build_type") + " started at: " + new Date());
|
||||
echo.addText(project.getProperty("line.separator"));
|
||||
|
||||
var build_needed = false;
|
||||
|
||||
// Skip leading DUMMY.
|
||||
for (var i = 1; i < build_files.length; i++) {
|
||||
build_file = build_files[i];
|
||||
build_file_needed = true;
|
||||
|
||||
if ((new File(build_file)).isDirectory()) {
|
||||
build_file_needed = false;
|
||||
}
|
||||
var rel = build_file.split(project.getBaseDir(), 2)[1];
|
||||
if (rel && (rel.startsWith("/bin/") || rel.startsWith("/gen/") || rel.endsWith(".class"))) {
|
||||
build_file_needed = false;
|
||||
}
|
||||
if (build_file_needed) {
|
||||
echo.addText("1 ");
|
||||
} else {
|
||||
echo.addText("0 ");
|
||||
}
|
||||
echo.addText(build_file);
|
||||
echo.addText(project.getProperty("line.separator"));
|
||||
build_needed |= build_file_needed;
|
||||
}
|
||||
|
||||
echo.addText(project.getProperty("project_name") + " build type " + project.getProperty("build_type") + " checked at: " + new Date());
|
||||
if (build_needed) {
|
||||
echo.addText(" requires updating");
|
||||
} else {
|
||||
echo.addText(" does not require updating");
|
||||
}
|
||||
echo.addText(project.getProperty("line.separator"));
|
||||
|
||||
echo.perform();
|
||||
|
||||
// The if below checks for the property being defined, not its value.
|
||||
if (build_needed) {
|
||||
project.setProperty("build_needed", build_needed);
|
||||
}
|
||||
]]>
|
||||
</script>
|
||||
</target>
|
||||
|
||||
<target name="compile" depends="build_needed" if="build_needed">
|
||||
<exec executable="${topsrcdir}/mach" dir="${topobjdir}" failonerror="true">
|
||||
<arg value="build"/>
|
||||
<arg value="${objdir}/ANDROID_ECLIPSE_PROJECT_${project_name}"/>
|
||||
|
@ -96,6 +96,16 @@ class TestAndroidEclipseBackend(BackendTester):
|
||||
lines = [line.strip() for line in lines]
|
||||
self.assertIn('<classpathentry combineaccessrules="false" kind="src" path="/library1" />', lines)
|
||||
|
||||
def test_extra_jars(self):
|
||||
"""Ensure we add class path entries to extra jars iff asked to."""
|
||||
self.env = self._consume('android_eclipse', AndroidEclipseBackend)
|
||||
self.assertExists('main2', '.classpath')
|
||||
# This is brittle but simple.
|
||||
with open(mozpath.join(self.env.topobjdir, 'android_eclipse', 'main2', '.classpath'), 'rt') as fh:
|
||||
lines = fh.readlines()
|
||||
lines = [line.strip() for line in lines]
|
||||
self.assertIn('<classpathentry exported="true" kind="lib" path="%s/main2/extra.jar" />' % self.env.topsrcdir, lines)
|
||||
|
||||
def test_included_projects(self):
|
||||
"""Ensure we include another project correctly."""
|
||||
self.env = self._consume('android_eclipse', AndroidEclipseBackend)
|
||||
@ -140,12 +150,6 @@ class TestAndroidEclipseBackend(BackendTester):
|
||||
self.assertNotInManifest('main1', 'assets')
|
||||
self.assertInManifest('main2', 'assets')
|
||||
|
||||
def test_manifest_extra_jars(self):
|
||||
"""Ensure we symlink extra jars iff asked to."""
|
||||
self.env = self._consume('android_eclipse', AndroidEclipseBackend)
|
||||
self.assertNotInManifest('main1', 'libs')
|
||||
self.assertInManifest('main2', 'libs/extra.jar')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
Loading…
Reference in New Issue
Block a user