Bug 973807 - Fixes to AndroidEclipse build backend. r=me

Largest changes: run mach less frequently and add build logging.
This commit is contained in:
Nick Alexander 2014-02-18 00:08:41 -08:00
parent 2d583fd28f
commit dd3e43e814
5 changed files with 98 additions and 27 deletions

View File

@ -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',

View File

@ -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 = {}

View File

@ -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=&quot;${build_type}&quot;&#10;-Dbuild_files=&quot;DUMMY ${build_files}&quot;"/>
</launchConfiguration>

View File

@ -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}"/>

View File

@ -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()