Bug 1253431 part 1 - Add SDK_FILES to moz.build; r?gps
This adds support for an SDK_FILES variable in moz.build, which creates
a FinalTargetFiles object to install files into dist/sdk/
MozReview-Commit-ID: 97a5NdbZmmD
--- a/python/mozbuild/mozbuild/backend/recursivemake.py
+++ b/python/mozbuild/mozbuild/backend/recursivemake.py
@@ -31,24 +31,22 @@ from mozbuild.frontend.context import (
)
from .common import CommonBackend
from ..frontend.data import (
AndroidAssetsDirs,
AndroidResDirs,
AndroidExtraResDirs,
AndroidExtraPackages,
AndroidEclipseProjectData,
- BrandingFiles,
ChromeManifestEntry,
ConfigFileSubstitution,
ContextDerived,
ContextWrapped,
Defines,
DirectoryTraversal,
- Exports,
ExternalLibrary,
FinalTargetFiles,
FinalTargetPreprocessedFiles,
GeneratedFile,
GeneratedSources,
HostDefines,
HostLibrary,
HostProgram,
@@ -1239,16 +1237,17 @@ INSTALL_TARGETS += %(prefix)s
def _process_final_target_files(self, obj, files, backend_file):
target = obj.install_target
path = mozpath.basedir(target, (
'dist/bin',
'dist/xpi-stage',
'_tests',
'dist/include',
'dist/branding',
+ 'dist/sdk',
))
if not path:
raise Exception("Cannot install to " + target)
manifest = path.replace('/', '_')
install_manifest = self._install_manifests[manifest]
reltarget = mozpath.relpath(target, path)
--- a/python/mozbuild/mozbuild/frontend/context.py
+++ b/python/mozbuild/mozbuild/frontend/context.py
@@ -1230,16 +1230,30 @@ VARIABLES = {
For example, to export ``foo.png`` to the top-level directory and
``bar.png`` to the directory ``images/subdir``, append to
``BRANDING_FILES`` like so::
BRANDING_FILES += ['foo.png']
BRANDING_FILES.images.subdir += ['bar.png']
"""),
+ 'SDK_FILES': (ContextDerivedTypedHierarchicalStringList(Path), list,
+ """List of files to be installed into the sdk directory.
+
+ ``SDK_FILES`` will copy (or symlink, if the platform supports it)
+ the contents of its files to the ``dist/sdk`` directory. Files that
+ are destined for a subdirectory can be specified by accessing a field.
+ For example, to export ``foo.py`` to the top-level directory and
+ ``bar.py`` to the directory ``subdir``, append to
+ ``SDK_FILES`` like so::
+
+ SDK_FILES += ['foo.py']
+ SDK_FILES.subdir += ['bar.py']
+ """),
+
'SDK_LIBRARY': (bool, bool,
"""Whether the library built in the directory is part of the SDK.
The library will be copied into ``SDK_LIB_DIR`` (``$DIST/sdk/lib``).
"""),
'SIMPLE_PROGRAMS': (StrictOrderingOnAppendList, list,
"""Compile a list of executable names.
--- a/python/mozbuild/mozbuild/frontend/data.py
+++ b/python/mozbuild/mozbuild/frontend/data.py
@@ -841,16 +841,29 @@ class BrandingFiles(FinalTargetFiles):
this object fills that role. It just has a reference to the underlying
HierarchicalStringList, which is created when parsing BRANDING_FILES.
"""
@property
def install_target(self):
return 'dist/branding'
+class SdkFiles(FinalTargetFiles):
+ """Sandbox container object for SDK_FILES, which is a
+ HierarchicalStringList.
+
+ We need an object derived from ContextDerived for use in the backend, so
+ this object fills that role. It just has a reference to the underlying
+ HierarchicalStringList, which is created when parsing SDK_FILES.
+ """
+ @property
+ def install_target(self):
+ return 'dist/sdk'
+
+
class GeneratedFile(ContextDerived):
"""Represents a generated file."""
__slots__ = (
'script',
'method',
'output',
'inputs',
--- a/python/mozbuild/mozbuild/frontend/emitter.py
+++ b/python/mozbuild/mozbuild/frontend/emitter.py
@@ -55,16 +55,17 @@ from .data import (
Library,
Linkable,
LinkageWrongKindError,
LocalInclude,
PerSourceFlag,
PreprocessedTestWebIDLFile,
PreprocessedWebIDLFile,
Program,
+ SdkFiles,
SharedLibrary,
SimpleProgram,
Sources,
StaticLibrary,
TestHarnessFiles,
TestingFiles,
TestWebIDLFile,
TestManifest,
@@ -827,16 +828,17 @@ class TreeMetadataEmitter(LoggingMixin):
yield LocalInclude(context, local_include)
components = []
for var, cls in (
('BRANDING_FILES', BrandingFiles),
('EXPORTS', Exports),
('FINAL_TARGET_FILES', FinalTargetFiles),
('FINAL_TARGET_PP_FILES', FinalTargetPreprocessedFiles),
+ ('SDK_FILES', SdkFiles),
('TESTING_FILES', TestingFiles),
):
all_files = context.get(var)
if not all_files:
continue
if dist_install is False and var != 'TESTING_FILES':
raise SandboxValidationError(
'%s cannot be used with DIST_INSTALL = False' % var,
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/sdk-files/moz.build
@@ -0,0 +1,11 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+SDK_FILES += [
+ 'bar.ico',
+ 'sub/quux.png',
+]
+
+SDK_FILES.icons += [
+ 'foo.ico',
+]
--- a/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
+++ b/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
@@ -489,16 +489,28 @@ class TestRecursiveMakeBackend(BackendTe
#BRANDING_FILES should appear in the dist_branding install manifest.
m = InstallManifest(path=os.path.join(env.topobjdir,
'_build_manifests', 'install', 'dist_branding'))
self.assertEqual(len(m), 3)
self.assertIn('bar.ico', m)
self.assertIn('quux.png', m)
self.assertIn('icons/foo.ico', m)
+ def test_sdk_files(self):
+ """Ensure SDK_FILES is handled properly."""
+ env = self._consume('sdk-files', RecursiveMakeBackend)
+
+ #SDK_FILES should appear in the dist_sdk install manifest.
+ m = InstallManifest(path=os.path.join(env.topobjdir,
+ '_build_manifests', 'install', 'dist_sdk'))
+ self.assertEqual(len(m), 3)
+ self.assertIn('bar.ico', m)
+ self.assertIn('quux.png', m)
+ self.assertIn('icons/foo.ico', m)
+
def test_test_manifests_files_written(self):
"""Ensure test manifests get turned into files."""
env = self._consume('test-manifests-written', RecursiveMakeBackend)
tests_dir = mozpath.join(env.topobjdir, '_tests')
m_master = mozpath.join(tests_dir, 'testing', 'mochitest', 'tests', 'mochitest.ini')
x_master = mozpath.join(tests_dir, 'xpcshell', 'xpcshell.ini')
self.assertTrue(os.path.exists(m_master))
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/frontend/data/sdk-files/moz.build
@@ -0,0 +1,12 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+SDK_FILES += [
+ 'bar.ico',
+ 'baz.png',
+ 'foo.xpm',
+]
+
+SDK_FILES.icons += [
+ 'quux.icns',
+]
--- a/python/mozbuild/mozbuild/test/frontend/test_emitter.py
+++ b/python/mozbuild/mozbuild/test/frontend/test_emitter.py
@@ -25,16 +25,17 @@ from mozbuild.frontend.data import (
GeneratedFile,
GeneratedSources,
HostDefines,
HostSources,
IPDLFile,
JARManifest,
LocalInclude,
Program,
+ SdkFiles,
SharedLibrary,
SimpleProgram,
Sources,
StaticLibrary,
TestHarnessFiles,
TestManifest,
UnifiedSources,
VariablePassthru,
@@ -341,16 +342,32 @@ class TestEmitterBasic(unittest.TestCase
self.assertEqual(files._strings, ['bar.ico', 'baz.png', 'foo.xpm'])
self.assertIn('icons', files._children)
icons = files._children['icons']
self.assertEqual(icons._strings, ['quux.icns'])
+ def test_sdk_files(self):
+ reader = self.reader('sdk-files')
+ objs = self.read_topsrcdir(reader)
+
+ self.assertEqual(len(objs), 1)
+ self.assertIsInstance(objs[0], SdkFiles)
+
+ files = objs[0].files
+
+ self.assertEqual(files._strings, ['bar.ico', 'baz.png', 'foo.xpm'])
+
+ self.assertIn('icons', files._children)
+ icons = files._children['icons']
+
+ self.assertEqual(icons._strings, ['quux.icns'])
+
def test_program(self):
reader = self.reader('program')
objs = self.read_topsrcdir(reader)
self.assertEqual(len(objs), 3)
self.assertIsInstance(objs[0], Program)
self.assertIsInstance(objs[1], SimpleProgram)
self.assertIsInstance(objs[2], SimpleProgram)