Bug 1380605 - modifications to build openh264 v1.7.1 draft
authorNick Thomas <nthomas@mozilla.com>
Wed, 30 Aug 2017 12:37:56 +1200
changeset 656282 f351e5349d5b8f055936a6232d01b34916bd4b8e
parent 656280 c494947d4007274be8b7bb3a0bc23bf3f0d9a25d
child 729081 df375b6cd19fd646330866fd940bee28f42023c9
push id77147
push usernthomas@mozilla.com
push dateWed, 30 Aug 2017 23:23:16 +0000
bugs1380605, 64022
milestone57.0a1
Bug 1380605 - modifications to build openh264 v1.7.1 Notable changes * ensure we run dump-symbols and upload actions on all platforms * On android: * add configuration and support for aarch64 * set min_sdk levels to match Fennec builds * use a full copy of the r11c ndk (our truncated one was missing toolchains we needed) and set NDKROOT when calling build * ensure the tooltool provided sdk is on the PATH * on linux copy tooltool.py into the mock environment, so we can get dump_syms from tt * remove macosx32 config as we've deprecated that in Firefox builds * update dump_syms to recent m-c, notably for aarch64 support on linux * on linux rev e365137fa61bfd729617ba1ebf9f1ed79facd1f2 (via try 0f72a5c28be1cdc2f3bdfaafdf3826254f6ba077) * on mac rev e365137fa61bfd729617ba1ebf9f1ed79facd1f2 (via compile on a bld-lin-r5) * on windows rev a4a448ba7f187069fce916ee234a06cbb0d06f80 (via try dc8b121e3c08e8022d62c0fa1951dd3dc4d6f7cc) * switch to Visual Studio 2015 Update 3 on win32/win64 to match Firefox * many updates to environement variables * painful to get win64 right to run win32 dump_syms.exe, but that's why the x86 redist is on teh PATH * unwind the changes to get_output_from_command() in v1.6 patch to avoid affecting other builds, and use query_env() which has this support already * add a scp_upload_directory since we don't have rsync on windows, use that to talk to the ffxbld upload host (not a long term solution but OK for now) Applies on top of https://reviewboard.mozilla.org/r/64022/diff/4#index_header MozReview-Commit-ID: B3NiWFvr2oR
testing/mozharness/configs/openh264/android-aarch64.py
testing/mozharness/configs/openh264/android-arm.py
testing/mozharness/configs/openh264/android-x86.py
testing/mozharness/configs/openh264/linux32.py
testing/mozharness/configs/openh264/linux64.py
testing/mozharness/configs/openh264/macosx32.py
testing/mozharness/configs/openh264/tooltool-manifests/android.manifest
testing/mozharness/configs/openh264/tooltool-manifests/linux.manifest
testing/mozharness/configs/openh264/tooltool-manifests/osx.manifest
testing/mozharness/configs/openh264/tooltool-manifests/win.manifest
testing/mozharness/configs/openh264/win32.py
testing/mozharness/configs/openh264/win64.py
testing/mozharness/mozharness/base/script.py
testing/mozharness/mozharness/base/transfer.py
testing/mozharness/scripts/openh264_build.py
new file mode 100644
--- /dev/null
+++ b/testing/mozharness/configs/openh264/android-aarch64.py
@@ -0,0 +1,46 @@
+import os
+
+import mozharness
+
+external_tools_path = os.path.join(
+    os.path.abspath(os.path.dirname(os.path.dirname(mozharness.__file__))),
+    'external_tools',
+)
+
+config = {
+    'default_actions': [
+        'get-tooltool',
+        'checkout-sources',
+        'build',
+        # 'test',  # can't run android tests on linux hosts
+        'package',
+        'dump-symbols',
+        'upload',
+    ],
+
+    'tooltool_manifest_file': "android.manifest",
+    'tooltool_cache': "/builds/tooltool_cache",
+    'exes': {
+        'gittool.py': [os.path.join(external_tools_path, 'gittool.py')],
+        'tooltool.py': "/builds/tooltool.py",
+        'python2.7': "/tools/python27/bin/python2.7",
+    },
+    'dump_syms_binary': 'dump_syms',
+    'arch': 'aarch64',
+    # https://dxr.mozilla.org/mozilla-central/rev/5322c03f4c8587fe526172d3f87160031faa6d75/mobile/android/config/mozconfigs/android-aarch64/nightly#6
+    'min_sdk': 21,
+    'use_mock': True,
+    'mock_target': 'mozilla-centos6-x86_64',
+    'mock_packages': ['make', 'git', 'nasm', 'glibc-devel.i686',
+                      'libstdc++-devel.i686', 'zip', 'yasm',
+                      'mozilla-python27'],
+    'mock_files': [
+        ('/home/cltbld/.ssh', '/home/mock_mozilla/.ssh'),
+        ('/builds/relengapi.tok', '/builds/relengapi.tok'),
+        ('/tools/tooltool.py', '/builds/tooltool.py'),
+    ],
+    'operating_system': 'android',
+    'partial_env': {
+        'PATH': '%(abs_work_dir)s/android-sdk-linux/tools:%(PATH)s',
+    },
+}
--- a/testing/mozharness/configs/openh264/android-arm.py
+++ b/testing/mozharness/configs/openh264/android-arm.py
@@ -9,31 +9,38 @@ external_tools_path = os.path.join(
 
 config = {
     'default_actions': [
         'get-tooltool',
         'checkout-sources',
         'build',
         # 'test',  # can't run android tests on linux hosts
         'package',
+        'dump-symbols',
+        'upload',
     ],
 
     'tooltool_manifest_file': "android.manifest",
     'tooltool_cache': "/builds/tooltool_cache",
     'exes': {
         'gittool.py': [os.path.join(external_tools_path, 'gittool.py')],
         'tooltool.py': "/builds/tooltool.py",
         'python2.7': "/tools/python27/bin/python2.7",
     },
     'dump_syms_binary': 'dump_syms',
     'arch': 'arm',
+    # https://dxr.mozilla.org/mozilla-central/rev/5322c03f4c8587fe526172d3f87160031faa6d75/mobile/android/config/mozconfigs/android-api-15/nightly#6
+    'min_sdk': 16,
     'use_mock': True,
     'mock_target': 'mozilla-centos6-x86_64',
     'mock_packages': ['make', 'git', 'nasm', 'glibc-devel.i686',
                       'libstdc++-devel.i686', 'zip', 'yasm',
                       'mozilla-python27'],
     'mock_files': [
         ('/home/cltbld/.ssh', '/home/mock_mozilla/.ssh'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
         ('/tools/tooltool.py', '/builds/tooltool.py'),
     ],
     'operating_system': 'android',
+    'partial_env': {
+        'PATH': '%(abs_work_dir)s/android-sdk-linux/tools:%(PATH)s',
+    },
 }
--- a/testing/mozharness/configs/openh264/android-x86.py
+++ b/testing/mozharness/configs/openh264/android-x86.py
@@ -9,32 +9,39 @@ external_tools_path = os.path.join(
 
 config = {
     'default_actions': [
         'get-tooltool',
         'checkout-sources',
         'build',
         # 'test',  # can't run android tests on linux hosts
         'package',
+        'dump-symbols',
+        'upload',
     ],
 
     'tooltool_manifest_file': "android.manifest",
     'tooltool_cache': "/builds/tooltool_cache",
     'exes': {
         'gittool.py': [os.path.join(external_tools_path, 'gittool.py')],
         'tooltool.py': "/builds/tooltool.py",
         'python2.7': "/tools/python27/bin/python2.7",
     },
     'avoid_avx2': True,
     'dump_syms_binary': 'dump_syms',
     'arch': 'x86',
+    # https://dxr.mozilla.org/mozilla-central/rev/5322c03f4c8587fe526172d3f87160031faa6d75/mobile/android/config/mozconfigs/android-x86/nightly#4
+    'min_sdk': 16,
     'use_mock': True,
     'mock_target': 'mozilla-centos6-x86_64',
     'mock_packages': ['make', 'git', 'nasm', 'glibc-devel.i686',
                       'libstdc++-devel.i686', 'zip', 'yasm',
                       'mozilla-python27'],
     'mock_files': [
         ('/home/cltbld/.ssh', '/home/mock_mozilla/.ssh'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
         ('/tools/tooltool.py', '/builds/tooltool.py'),
     ],
     'operating_system': 'android',
+    'partial_env': {
+        'PATH': '%(abs_work_dir)s/android-sdk-linux/tools:%(PATH)s',
+    },
 }
--- a/testing/mozharness/configs/openh264/linux32.py
+++ b/testing/mozharness/configs/openh264/linux32.py
@@ -21,11 +21,12 @@ config = {
     'avoid_avx2': True,
     'mock_target': 'mozilla-centos6-x86_64',
     'mock_packages': ['make', 'git', 'nasm', 'glibc-devel.i686',
                       'libstdc++-devel.i686', 'zip', 'yasm',
                       'mozilla-python27'],
     'mock_files': [
         ('/home/cltbld/.ssh', '/home/mock_mozilla/.ssh'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
+        ('/tools/tooltool.py', '/builds/tooltool.py'),
     ],
     'operating_system': 'linux',
 }
--- a/testing/mozharness/configs/openh264/linux64.py
+++ b/testing/mozharness/configs/openh264/linux64.py
@@ -21,11 +21,12 @@ config = {
     'avoid_avx2': True,
     'mock_target': 'mozilla-centos6-x86_64',
     'mock_packages': ['make', 'git', 'nasm', 'glibc-devel.i686',
                       'libstdc++-devel.i686', 'zip', 'yasm',
                       'mozilla-python27'],
     'mock_files': [
         ('/home/cltbld/.ssh', '/home/mock_mozilla/.ssh'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
+        ('/tools/tooltool.py', '/builds/tooltool.py'),
     ],
     'operating_system': 'linux',
 }
deleted file mode 100644
--- a/testing/mozharness/configs/openh264/macosx32.py
+++ /dev/null
@@ -1,21 +0,0 @@
-import os
-
-import mozharness
-
-external_tools_path = os.path.join(
-    os.path.abspath(os.path.dirname(os.path.dirname(mozharness.__file__))),
-    'external_tools',
-)
-
-config = {
-    'tooltool_manifest_file': "osx.manifest",
-    'tooltool_cache': "/builds/tooltool_cache",
-    'exes': {
-        'gittool.py': [os.path.join(external_tools_path, 'gittool.py')],
-        'tooltool.py': "/builds/tooltool.py",
-        'python2.7': "/tools/python27/bin/python2.7",
-    },
-    'dump_syms_binary': 'dump_syms',
-    'arch': 'x86',
-    'use_yasm': True,
-}
--- a/testing/mozharness/configs/openh264/tooltool-manifests/android.manifest
+++ b/testing/mozharness/configs/openh264/tooltool-manifests/android.manifest
@@ -1,17 +1,26 @@
 [
-{
-"size": 357533004,
-"visibility": "internal",
-"digest": "9b24b6db45ca4f6418d18119e3d2dd48e2a352e977ebf4fd0b2a8c4103fd0735eacb0f7360ff3a2eda6777fdd1029325ca23b8a4c34542b3b1fa487ff633647c",
-"algorithm": "sha512",
-"filename": "android-ndk.tar.bz2",
-"unpack": true
-},
-{
-"size": 4086983, 
-"visibility": "public", 
-"digest": "f9b8922384b489cf4969b1d26d4fef93db5882dacadd9e679e728164220b237ce170e94f45e6a6ede1055f4d06097f994e5d0185f42cf90b9e3dc57dfc2d0005", 
-"algorithm": "sha512", 
-"filename": "dump_syms"
-}
+  {
+    "version": "Android NDK r11c full",
+    "size": 434664300,
+    "visibility": "internal",
+    "digest": "c59a8fe59f52324ccce5ca6563e8e0189c3fb5538b2a435249581eb994bfb89a70b28e366bab102c36a1e11ee50cd657f1e084e40306f660d3cd2d60d09097bf",
+    "algorithm": "sha512",
+    "filename": "android-ndk-r11c-linux-x86_64.tar.xz",
+    "unpack": true
+  },
+  {
+    "size": 735225120,
+    "visibility": "internal",
+    "digest": "ec936b87d151fcf0a5920e0954fbfff18fc04595d753f6b11a0582faee3ce60e3429c828a94c1533ae31ff27272a6d0c637d901153b946e51241ea89ce8179b3",
+    "algorithm": "sha512",
+    "filename": "android-sdk-linux.tar.xz",
+    "unpack": true
+  },
+  {
+    "size": 9507240,
+    "visibility": "public",
+    "digest": "3cf69a10dca3969bcd2873b96b0207de01ce13f299b2af37f424f21959be849c0e729d5f74cca41f33e0c59bc87b2329a07ac9f901b4a0a9672e6441ceca704d",
+    "algorithm": "sha512",
+    "filename": "dump_syms"
+  }
 ]
--- a/testing/mozharness/configs/openh264/tooltool-manifests/linux.manifest
+++ b/testing/mozharness/configs/openh264/tooltool-manifests/linux.manifest
@@ -1,9 +1,9 @@
 [
-{
-"size": 4086983, 
-"visibility": "public", 
-"digest": "f9b8922384b489cf4969b1d26d4fef93db5882dacadd9e679e728164220b237ce170e94f45e6a6ede1055f4d06097f994e5d0185f42cf90b9e3dc57dfc2d0005", 
-"algorithm": "sha512", 
-"filename": "dump_syms"
-}
+  {
+    "size": 9507240,
+    "visibility": "public",
+    "digest": "3cf69a10dca3969bcd2873b96b0207de01ce13f299b2af37f424f21959be849c0e729d5f74cca41f33e0c59bc87b2329a07ac9f901b4a0a9672e6441ceca704d",
+    "algorithm": "sha512",
+    "filename": "dump_syms"
+  }
 ]
--- a/testing/mozharness/configs/openh264/tooltool-manifests/osx.manifest
+++ b/testing/mozharness/configs/openh264/tooltool-manifests/osx.manifest
@@ -1,10 +1,9 @@
 [
-{
-"size": 393368, 
-"visibility": "public", 
-"digest": "dcbd679a57ac3a1bc20df45cd8770b462d2c430d1c5fb85366c02904422824ed4193a66d936fa9d21fb49190f5915f9b24aad16e3eb8b7c9a90d09c93067982f", 
-"algorithm": "sha512", 
-"filename": "dump_syms"
-}
-]
-
+  {
+    "size": 475508,
+    "visibility": "public",
+    "digest": "d705fb149fd7ec6a0833000224f802bd8cbb0f3ecf96efa558010e63db691ff03a95180d9525229e7055e8810c528bf3d7f1a1ab97aecadab3c7c7de8668ab30",
+    "algorithm": "sha512",
+    "filename": "dump_syms"
+  }
+]
\ No newline at end of file
--- a/testing/mozharness/configs/openh264/tooltool-manifests/win.manifest
+++ b/testing/mozharness/configs/openh264/tooltool-manifests/win.manifest
@@ -1,10 +1,17 @@
 [
-{
-"size": 51200, 
-"visibility": "public", 
-"digest": "3071d2c22325c6f952d99491005dce85887ebd6a7ec52a91af157cf6f1ef4453234489d1269f7f92c739e08fd8a747d1ea2d6a6cf13cc9818a2f99302b4eb970", 
-"algorithm": "sha512", 
-"filename": "dump_syms_vc1800.exe"
-}
-]
-
+  {
+    "version": "Visual Studio 2015 Update 3 14.0.25425.01 / SDK 10.0.14393.0",
+    "size": 326656969,
+    "digest": "babc414ffc0457d27f5a1ed24a8e4873afbe2f1c1a4075469a27c005e1babc3b2a788f643f825efedff95b79686664c67ec4340ed535487168a3482e68559bc7",
+    "algorithm": "sha512",
+    "filename": "vs2015u3.zip",
+    "unpack": true
+  },
+  {
+    "size": 56832,
+    "visibility": "public",
+    "digest": "01e6bd936ef008061b95a94008682869ebf2a29d1c035e49cd6579b1a020d0d195431221577f127eb52b97137337efe30e6de6c5a2f4b6a87ff2a990e9874e8e",
+    "algorithm": "sha512",
+    "filename": "dump_syms.exe"
+  }
+]
\ No newline at end of file
--- a/testing/mozharness/configs/openh264/win32.py
+++ b/testing/mozharness/configs/openh264/win32.py
@@ -3,35 +3,33 @@ import os
 
 import mozharness
 
 external_tools_path = os.path.join(
     os.path.abspath(os.path.dirname(os.path.dirname(mozharness.__file__))),
     'external_tools',
 )
 
-VSPATH = 'C:/tools/vs2013'
+VSPATH = '%(abs_work_dir)s/vs2015u3'
 config = {
    'tooltool_manifest_file': "win.manifest",
    'exes': {
        'gittool.py': [sys.executable, os.path.join(external_tools_path, 'gittool.py')],
        'python2.7': 'c:\\mozilla-build\\python27\\python2.7.exe',
        'tooltool.py': [sys.executable, "c:\\mozilla-build\\tooltool.py"],
    },
-   'dump_syms_binary': 'dump_syms_vc1800.exe',
+   'dump_syms_binary': 'dump_syms.exe',
    'arch': 'x86',
    'use_yasm': True,
    'operating_system': 'msvc',
    'partial_env': {
-       'PATH': '%s;%s;%s;%s;%s' % (
-           'c:/Program Files (x86)/Windows Kits/8.1/bin/x86;{_VSPATH}/Common7/IDE;{_VSPATH}/VC/BIN/amd64_x86;{_VSPATH}/VC/BIN/amd64;{_VSPATH}/Common7/Tools;{_VSPATH}/VC/VCPackages;c:/mozilla-build/moztools'.format(_VSPATH=VSPATH),
-           'c:/windows/Microsoft.NET/Framework/v3.5;c:/windows/Microsoft.NET/Framework/v4.0.30319',
+       'PATH': '%s;%s;%s' % (
+           '{_VSPATH}/VC/redist/x86/Microsoft.VC140.CRT;{_VSPATH}/VC/redist/x64/Microsoft.VC140.CRT;{_VSPATH}/SDK/Redist/ucrt/DLLs/x86;{_VSPATH}/SDK/Redist/ucrt/DLLs/x64;{_VSPATH}/VC/bin/amd64_x86;{_VSPATH}/VC/bin/amd64;{_VSPATH}/VC/bin;{_VSPATH}/SDK/bin/x86;{_VSPATH}/SDK/bin/x64;{_VSPATH}/DIA SDK/bin'.format(_VSPATH=VSPATH),
            os.environ['PATH'],
            'C:\\mozilla-build\\Git\\bin',
-           'C:\\mozilla-build\\svn-win32-1.6.3\\bin',
        ),
-       'WIN32_REDIST_DIR': '{_VSPATH}/VC/redist/x86/Microsoft.VC120.CRT'.format(_VSPATH=VSPATH),
-       'INCLUDE': 'c:\\Program Files (x86)\\Windows Kits\\8.1\\include\\shared;c:\\Program Files (x86)\\Windows Kits\\8.1\\include\\um;c:\\Program Files (x86)\\Windows Kits\\8.1\\include\\winrt;c:\\Program Files (x86)\\Windows Kits\\8.1\\include\\winrt\\wrl;c:\\Program Files (x86)\\Windows Kits\\8.1\\include\\winrt\\wrl\\wrappers;{_VSPATH}\\vc\\include;{_VSPATH}\\vc\\atlmfc\\include;c:\\tools\\sdks\\dx10\\include'.format(_VSPATH=VSPATH),
-       'LIB': 'c:\\Program Files (x86)\\Windows Kits\\8.1\\Lib\\winv6.3\\um\\x86;{_VSPATH}\\vc\\lib;{_VSPATH}\\vc\\atlmfc\\lib;c:\\tools\\sdks\\dx10\\lib'.format(_VSPATH=VSPATH),
-       'LIBPATH': 'c:\\Program Files (x86)\\Windows Kits\\8.1\\Lib\\winv6.3\\um\\x86;{_VSPATH}\\vc\\lib;{_VSPATH}\\vc\\atlmfc\\lib;c:\\tools\\sdks\\dx10\\lib'.format(_VSPATH=VSPATH),
-       'WINDOWSSDKDIR': 'c:\\Program Files (x86)\\Windows Kits\\8.1\\',
+       'WIN32_REDIST_DIR': '{_VSPATH}/VC/redist/x86/Microsoft.VC140.CRT'.format(_VSPATH=VSPATH),
+       'WIN_UCRT_REDIST_DIR': '{_VSPATH}/SDK/Redist/ucrt/DLLs/x86'.format(_VSPATH=VSPATH),
+       'INCLUDE': '{_VSPATH}/VC/include;{_VSPATH}/VC/atlmfc/include;{_VSPATH}/SDK/Include/10.0.14393.0/ucrt;{_VSPATH}/SDK/Include/10.0.14393.0/shared;{_VSPATH}/SDK/Include/10.0.14393.0/um;{_VSPATH}/SDK/Include/10.0.14393.0/winrt;{_VSPATH}/DIA SDK/include'.format(_VSPATH=VSPATH),
+       'LIB': '{_VSPATH}/VC/lib;{_VSPATH}/VC/atlmfc/lib;{_VSPATH}/SDK/lib/10.0.14393.0/ucrt/x86;{_VSPATH}/SDK/lib/10.0.14393.0/um/x86;{_VSPATH}/DIA SDK/lib'.format(_VSPATH=VSPATH),
+       'WINDOWSSDKDIR': '{_VSPATH}/SDK'.format(_VSPATH=VSPATH),
    },
 }
--- a/testing/mozharness/configs/openh264/win64.py
+++ b/testing/mozharness/configs/openh264/win64.py
@@ -3,35 +3,33 @@ import os
 
 import mozharness
 
 external_tools_path = os.path.join(
     os.path.abspath(os.path.dirname(os.path.dirname(mozharness.__file__))),
     'external_tools',
 )
 
-VSPATH = 'C:/tools/vs2013'
+VSPATH = '%(abs_work_dir)s/vs2015u3'
 config = {
    'tooltool_manifest_file': "win.manifest",
    'exes': {
         'gittool.py': [sys.executable, os.path.join(external_tools_path, 'gittool.py')],
         'python2.7': 'c:\\mozilla-build\\python27\\python2.7.exe',
         'tooltool.py': [sys.executable, "c:\\mozilla-build\\tooltool.py"],
    },
-   'dump_syms_binary': 'dump_syms_vc1800.exe',
+   'dump_syms_binary': 'dump_syms.exe',
    'arch': 'x64',
    'use_yasm': True,
    'operating_system': 'msvc',
    'partial_env': {
-       'PATH': '%s;%s;%s;%s;%s' % (
-           'c:/Program Files (x86)/Windows Kits/8.1/bin/x64;{_VSPATH}/Common7/IDE;{_VSPATH}/VC/BIN/amd64;{_VSPATH}/VC/BIN/x86_amd64;{_VSPATH}/VC/BIN;{_VSPATH}/Common7/Tools;{_VSPATH}/VC/VCPackages;c:/mozilla-build/moztools-x64'.format(_VSPATH=VSPATH),
-           'c:/windows/Microsoft.NET/Framework64/v3.5;c:/windows/Microsoft.NET/Framework64/v4.0.30319',
+       'PATH': '%s;%s;%s' % (
+           '{_VSPATH}/VC/bin/amd64;{_VSPATH}/VC/bin;{_VSPATH}/SDK/bin/x64;{_VSPATH}/VC/redist/x64/Microsoft.VC140.CRT;{_VSPATH}/SDK/Redist/ucrt/DLLs/x64;{_VSPATH}/VC/redist/x86/Microsoft.VC140.CRT;{_VSPATH}/SDK/Redist/ucrt/DLLs/x86;{_VSPATH}/DIA SDK/bin'.format(_VSPATH=VSPATH),
            os.environ['PATH'],
            'C:\\mozilla-build\\Git\\bin',
-           'C:\\mozilla-build\\svn-win32-1.6.3\\bin',
        ),
-       'WIN32_REDIST_DIR': '{_VSPATH}/VC/redist/x64/Microsoft.VC120.CRT'.format(_VSPATH=VSPATH),
-       'INCLUDE': 'c:\\Program Files (x86)\\Windows Kits\\8.1\\include\\shared;c:\\Program Files (x86)\\Windows Kits\\8.1\\include\\um;c:\\Program Files (x86)\\Windows Kits\\8.1\\include\\winrt;c:\\Program Files (x86)\\Windows Kits\\8.1\\include\\winrt\\wrl;c:\\Program Files (x86)\\Windows Kits\\8.1\\include\\winrt\\wrl\\wrappers;{_VSPATH}\\vc\\include;{_VSPATH}\\vc\\atlmfc\\include;c:\\tools\\sdks\\dx10\\include'.format(_VSPATH=VSPATH),
-       'LIB': 'c:\\Program Files (x86)\\Windows Kits\\8.1\\Lib\\winv6.3\\um\\x64;{_VSPATH}\\vc\\lib\\amd64;{_VSPATH}\\vc\\atlmfc\\lib\\amd64;c:\\tools\\sdks\\dx10\\lib\\x64'.format(_VSPATH=VSPATH),
-       'LIBPATH': 'c:\\Program Files (x86)\\Windows Kits\\8.1\\Lib\\winv6.3\\um\\x64;{_VSPATH}\\vc\\lib\\amd64;{_VSPATH}\\vc\\atlmfc\\lib\\amd64;c:\\tools\\sdks\\dx10\\lib\\x64'.format(_VSPATH=VSPATH),
-       'WINDOWSSDKDIR': 'c:\\Program Files (x86)\\Windows Kits\\8.1\\',
+       'WIN32_REDIST_DIR': '{_VSPATH}/VC/redist/x64/Microsoft.VC140.CRT'.format(_VSPATH=VSPATH),
+       'WIN_UCRT_REDIST_DIR': '{_VSPATH}/SDK/Redist/ucrt/DLLs/x64'.format(_VSPATH=VSPATH),
+       'INCLUDE': '{_VSPATH}/VC/include;{_VSPATH}/VC/atlmfc/include;{_VSPATH}/SDK/Include/10.0.14393.0/ucrt;{_VSPATH}/SDK/Include/10.0.14393.0/shared;{_VSPATH}/SDK/Include/10.0.14393.0/um;{_VSPATH}/SDK/Include/10.0.14393.0/winrt;{_VSPATH}/DIA SDK/include'.format(_VSPATH=VSPATH),
+       'LIB': '{_VSPATH}/VC/lib/amd64;{_VSPATH}/VC/atlmfc/lib/amd64;{_VSPATH}/SDK/lib/10.0.14393.0/ucrt/x64;{_VSPATH}/SDK/lib/10.0.14393.0/um/x64;{_VSPATH}/DIA SDK/lib/amd64'.format(_VSPATH=VSPATH),
+       'WINDOWSSDKDIR': '{_VSPATH}/SDK'.format(_VSPATH=VSPATH),
    },
 }
--- a/testing/mozharness/mozharness/base/script.py
+++ b/testing/mozharness/mozharness/base/script.py
@@ -1453,17 +1453,17 @@ class ScriptMixin(PlatformMixin):
                 self.return_code = fatal_exit_code
                 self.fatal("Halting on failure while running %s" % command,
                            exit_code=fatal_exit_code)
         if return_type == 'num_errors':
             return parser.num_errors
         return returncode
 
     def get_output_from_command(self, command, cwd=None,
-                                halt_on_failure=False, env=None, partial_env=None,
+                                halt_on_failure=False, env=None,
                                 silent=False, log_level=INFO,
                                 tmpfile_base_path='tmpfile',
                                 return_type='output', save_tmpfiles=False,
                                 throw_exception=False, fatal_exit_code=2,
                                 ignore_errors=False, success_codes=None):
         """Similar to run_command, but where run_command is an
         os.system(command) analog, get_output_from_command is a `command`
         analog.
@@ -1485,18 +1485,16 @@ class ScriptMixin(PlatformMixin):
             command (str | list): command or list of commands to
               execute and log.
             cwd (str, optional): directory path from where to execute the
               command. Defaults to `None`.
             halt_on_failure (bool, optional): whether or not to redefine the
               log level as `FATAL` on error. Defaults to False.
             env (dict, optional): key-value of environment values to use to
               run the command. Defaults to None.
-            partial_env (dict, optional): key-value of environment values to
-              replace from the current environment values. Defaults to None.
             silent (bool, optional): whether or not to output the stdout of
               executing the command. Defaults to False.
             log_level (str, optional): log level name to use on normal execution.
               Defaults to `INFO`.
             tmpfile_base_path (str, optional): base path of the file to which
               the output will be writen to. Defaults to 'tmpfile'.
             return_type (str, optional): if equal to 'output' then the complete
               output of the executed command is returned, otherwise the written
@@ -1555,26 +1553,19 @@ class ScriptMixin(PlatformMixin):
         except IOError:
             level = ERROR
             if halt_on_failure:
                 level = FATAL
             self.log("Can't open %s for writing!" % tmp_stderr_filename +
                      self.exception(), level=level)
             return None
         shell = True
-        if isinstance(command, list) or isinstance(command, tuple):
+        if isinstance(command, list):
             shell = False
 
-        if env is None:
-            if partial_env:
-                self.info("Using partial env: %s" % pprint.pformat(partial_env))
-                env = self.query_env(partial_env=partial_env)
-        else:
-            self.info("Using env: %s" % pprint.pformat(env))
-
         p = subprocess.Popen(command, shell=shell, stdout=tmp_stdout,
                              cwd=cwd, stderr=tmp_stderr, env=env)
         # XXX: changed from self.debug to self.log due to this error:
         #      TypeError: debug() takes exactly 1 argument (2 given)
         self.log("Temporary files: %s and %s" % (tmp_stdout_filename, tmp_stderr_filename), level=DEBUG)
         p.wait()
         tmp_stdout.close()
         tmp_stderr.close()
--- a/testing/mozharness/mozharness/base/transfer.py
+++ b/testing/mozharness/mozharness/base/transfer.py
@@ -116,8 +116,57 @@ class TransferMixin(object):
         try:
             r = urllib2.urlopen(url, timeout=timeout)
             j = json.load(r)
             self.log(pprint.pformat(j), level=log_level)
         except:
             self.exception(message="Unable to download %s!" % url)
             raise
         return j
+
+    def scp_upload_directory(self, local_path, ssh_key, ssh_user,
+                             remote_host, remote_path,
+                             scp_options=None,
+                             error_level=ERROR,
+                             create_remote_directory=True,
+                            ):
+        """
+        Create a remote directory and upload the contents of
+        a local directory to it via scp only
+
+        Returns:
+            None: on success
+              -1: if local_path is not a directory
+              -2: if the remote_directory cannot be created
+                  (it only makes sense if create_remote_directory is True)
+              -3: scp fails to copy to the remote directory
+        """
+        dirs = self.query_abs_dirs()
+        self.info("Uploading the contents of %s to %s:%s" % (local_path, remote_host, remote_path))
+        ssh = self.query_exe("ssh")
+        scp = self.query_exe("scp")
+        if scp_options is None:
+            scp_options = '-rp'
+        if not os.path.isdir(local_path):
+            self.log("%s isn't a directory!" % local_path,
+                     level=ERROR)
+            return -1
+        if create_remote_directory:
+            mkdir_error_list = [{
+                'substr': r'''exists but is not a directory''',
+                'level': ERROR
+            }] + SSHErrorList
+            if self.run_command([ssh, '-oIdentityFile=%s' % ssh_key,
+                                 '%s@%s' % (ssh_user, remote_host),
+                                 'mkdir', '-p', remote_path],
+                                cwd=dirs['abs_work_dir'],
+                                return_type='num_errors',
+                                error_list=mkdir_error_list):
+                self.log("Unable to create remote directory %s:%s!" % (remote_host, remote_path), level=error_level)
+                return -2
+        if self.run_command([scp, '-oIdentityFile=%s' % ssh_key,
+                             scp_options, '.',
+                             '%s@%s:%s/' % (ssh_user, remote_host, remote_path)],
+                            cwd=local_path,
+                            return_type='num_errors',
+                            error_list=SSHErrorList):
+            self.log("Unable to scp %s to %s:%s!" % (local_path, remote_host, remote_path), level=error_level)
+            return -3
\ No newline at end of file
--- a/testing/mozharness/scripts/openh264_build.py
+++ b/testing/mozharness/scripts/openh264_build.py
@@ -41,16 +41,17 @@ class OpenH264Build(MockMixin, TransferM
 
     default_actions = [
         'get-tooltool',
         'checkout-sources',
         'build',
         'test',
         'package',
         'dump-symbols',
+        'upload',
     ]
 
     config_options = [
         [["--repo"], {
             "dest": "repo",
             "help": "OpenH264 repository to use",
             "default": "https://github.com/cisco/openh264.git"
         }],
@@ -61,17 +62,17 @@ class OpenH264Build(MockMixin, TransferM
         }],
         [["--debug"], {
             "dest": "debug_build",
             "action": "store_true",
             "help": "Do a debug build",
         }],
         [["--arch"], {
             "dest": "arch",
-            "help": "Arch type to use (x64, x86, or arm)",
+            "help": "Arch type to use (x64, x86, arm, or aarch64)",
         }],
         [["--os"], {
             "dest": "operating_system",
             "help": "Specify the operating system to build for",
         }],
         [["--use-mock"], {
             "dest": "use_mock",
             "help": "use mock to set up build environment",
@@ -94,20 +95,20 @@ class OpenH264Build(MockMixin, TransferM
 
     def __init__(self, require_config_file=False, config={},
                  all_actions=all_actions,
                  default_actions=default_actions):
 
         # Default configuration
         default_config = {
             'debug_build': False,
-            'upload_ssh_key': os.path.expanduser("~/.ssh/ffxbld_rsa"),
+            'upload_ssh_key': "~/.ssh/ffxbld_rsa",
             'upload_ssh_user': 'ffxbld',
-            'upload_ssh_host': 'stage.mozilla.org',
-            'upload_path_base': '/home/ffxbld/openh264',
+            'upload_ssh_host': 'upload.ffxbld.productdelivery.prod.mozaws.net',
+            'upload_path_base': '/tmp/openh264',
             'use_yasm': False,
         }
         default_config.update(config)
 
         VCSScript.__init__(
             self,
             config_options=self.config_options,
             require_config_file=require_config_file,
@@ -141,29 +142,22 @@ class OpenH264Build(MockMixin, TransferM
         except KeyError:
             self.error('missing a required key.')
 
     def query_package_name(self):
         if self.config['arch'] == "x64":
             bits = '64'
         else:
             bits = '32'
-
         version = self.config['revision']
 
         if sys.platform == 'linux2':
             if self.config.get('operating_system') == 'android':
-                if self.config.get('arch') == 'x86':
-                    return 'openh264-android-{arch}-{version}.zip'.format(
-                        version=version, bits=bits, arch=self.config['arch']
-                    )
-                else:
-                    return 'openh264-android-{arch}-{version}.zip'.format(
-                        version=version, bits=bits, arch='arm'
-                    )
+                return 'openh264-android-{arch}-{version}.zip'.format(
+                    version=version, arch=self.config['arch'])
             else:
                 return 'openh264-linux{bits}-{version}.zip'.format(version=version, bits=bits)
         elif sys.platform == 'darwin':
             return 'openh264-macosx{bits}-{version}.zip'.format(version=version, bits=bits)
         elif sys.platform == 'win32':
             return 'openh264-win{bits}-{version}.zip'.format(version=version, bits=bits)
         self.fatal("can't determine platform")
 
@@ -171,29 +165,33 @@ class OpenH264Build(MockMixin, TransferM
         dirs = self.query_abs_dirs()
         retval = []
         if self.config['debug_build']:
             retval.append('BUILDTYPE=Debug')
 
         if self.config['avoid_avx2']:
             retval.append('HAVE_AVX2=false')
 
-        if self.config['arch'] == 'x64':
+        if self.config['arch'] in ('x64', 'aarch64'):
             retval.append('ENABLE64BIT=Yes')
         else:
             retval.append('ENABLE64BIT=No')
 
         if "operating_system" in self.config:
             retval.append("OS=%s" % self.config['operating_system'])
             if self.config["operating_system"] == "android":
                 if self.config['arch'] == 'x86':
                     retval.append("ARCH=x86")
+                elif self.config['arch'] == 'aarch64':
+                    retval.append("ARCH=arm64")
+                else:
+                    retval.append("ARCH=arm")
                 retval.append('TARGET=invalid')
-                retval.append('NDKLEVEL=9')
-                retval.append('NDKROOT=%s/android-ndk' % dirs['abs_work_dir'])
+                retval.append('NDKLEVEL=%s' % self.config['min_sdk'])
+                retval.append('NDKROOT=%s/android-ndk-r11c' % dirs['abs_work_dir'])
 
         if self.config['use_yasm']:
             retval.append('ASM=yasm')
 
         return retval
 
     def query_upload_ssh_key(self):
         return self.config['upload_ssh_key']
@@ -206,19 +204,20 @@ class OpenH264Build(MockMixin, TransferM
 
     def query_upload_ssh_path(self):
         return "%s/%s" % (self.config['upload_path_base'], self.config['revision'])
 
     def run_make(self, target, capture_output=False):
         cmd = ['make', target] + self.query_make_params()
         dirs = self.query_abs_dirs()
         repo_dir = os.path.join(dirs['abs_work_dir'], 'src')
-        env = self.config.get('env')
-        partial_env = self.config.get('partial_env')
-        kwargs = dict(cwd=repo_dir, env=env, partial_env=partial_env)
+        env = None
+        if self.config.get('partial_env'):
+            env = self.query_env(self.config['partial_env'])
+        kwargs = dict(cwd=repo_dir, env=env)
         if capture_output:
             return self.get_output_from_command(cmd, **kwargs)
         else:
             return self.run_command(cmd, **kwargs)
 
     def checkout_sources(self):
         repo = self.config['repo']
         rev = self.config['revision']
@@ -295,36 +294,37 @@ class OpenH264Build(MockMixin, TransferM
         if not package_name:
             self.fatal("failure running make")
         zip_package_name = self.query_package_name()
         if not zip_package_name[-4:] == ".zip":
             self.fatal("Unexpected zip_package_name")
         symbol_package_name = "{base}.symbols.zip".format(base=zip_package_name[:-4])
         symbol_zip_path = os.path.join(dirs['abs_upload_dir'], symbol_package_name)
         repo_dir = os.path.join(dirs['abs_work_dir'], 'src')
-        env = self.config.get('env')
-        partial_env = self.config.get('partial_env')
-        kwargs = dict(cwd=repo_dir, env=env, partial_env=partial_env)
+        env = None
+        if self.config.get('partial_env'):
+            env = self.query_env(self.config['partial_env'])
+        kwargs = dict(cwd=repo_dir, env=env)
         dump_syms = os.path.join(dirs['abs_work_dir'], c['dump_syms_binary'])
         self.chmod(dump_syms, 0755)
         python = self.query_exe('python2.7')
         cmd = [python, os.path.join(external_tools_path, 'packagesymbols.py'),
                '--symbol-zip', symbol_zip_path,
                dump_syms, os.path.join(srcdir, package_name)]
         if self.config['use_mock']:
             self.disable_mock()
         self.run_command(cmd, **kwargs)
         if self.config['use_mock']:
             self.enable_mock()
 
     def upload(self):
         if self.config['use_mock']:
             self.disable_mock()
         dirs = self.query_abs_dirs()
-        self.rsync_upload_directory(
+        self.scp_upload_directory(
             dirs['abs_upload_dir'],
             self.query_upload_ssh_key(),
             self.query_upload_ssh_user(),
             self.query_upload_ssh_host(),
             self.query_upload_ssh_path(),
         )
         if self.config['use_mock']:
             self.enable_mock()