summaryrefslogtreecommitdiffstats
path: root/build/macosx
diff options
context:
space:
mode:
Diffstat (limited to 'build/macosx')
-rw-r--r--build/macosx/catalog.py123
-rw-r--r--build/macosx/cross-mozconfig.common32
-rw-r--r--build/macosx/mozconfig.common11
-rw-r--r--build/macosx/permissions/chown_revert.c18
-rw-r--r--build/macosx/permissions/chown_root.c12
5 files changed, 196 insertions, 0 deletions
diff --git a/build/macosx/catalog.py b/build/macosx/catalog.py
new file mode 100644
index 0000000000..e3d937ffaf
--- /dev/null
+++ b/build/macosx/catalog.py
@@ -0,0 +1,123 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import argparse
+import plistlib
+import ssl
+import sys
+from io import BytesIO
+from urllib.request import urlopen
+from xml.dom import minidom
+
+import certifi
+from mozpack.macpkg import Pbzx, uncpio, unxar
+
+
+def get_english(dict, default=None):
+ english = dict.get("English")
+ if english is None:
+ english = dict.get("en", default)
+ return english
+
+
+def get_content_at(url):
+ ssl_context = ssl.create_default_context(cafile=certifi.where())
+ f = urlopen(url, context=ssl_context)
+ return f.read()
+
+
+def get_plist_at(url):
+ return plistlib.loads(get_content_at(url))
+
+
+def show_package_content(url, digest=None, size=None):
+ package = get_content_at(url)
+ if size is not None and len(package) != size:
+ print(f"Package does not match size given in catalog: {url}", file=sys.stderr)
+ sys.exit(1)
+ # Ideally we'd check the digest, but it's not md5, sha1 or sha256...
+ # if digest is not None and hashlib.???(package).hexdigest() != digest:
+ # print(f"Package does not match digest given in catalog: {url}", file=sys.stderr)
+ # sys.exit(1)
+ for name, content in unxar(BytesIO(package)):
+ if name == "Payload":
+ for path, _, __ in uncpio(Pbzx(content)):
+ if path:
+ print(path.decode("utf-8"))
+
+
+def show_product_info(product, package_id=None):
+ # An alternative here would be to look at the MetadataURLs in
+ # product["Packages"], but going with Distributions allows to
+ # only do one request.
+ dist = get_english(product.get("Distributions"))
+ data = get_content_at(dist)
+ dom = minidom.parseString(data.decode("utf-8"))
+ for pkg_ref in dom.getElementsByTagName("pkg-ref"):
+ if pkg_ref.childNodes:
+ if pkg_ref.hasAttribute("packageIdentifier"):
+ id = pkg_ref.attributes["packageIdentifier"].value
+ else:
+ id = pkg_ref.attributes["id"].value
+
+ if package_id and package_id != id:
+ continue
+
+ for child in pkg_ref.childNodes:
+ if child.nodeType != minidom.Node.TEXT_NODE:
+ continue
+ for p in product["Packages"]:
+ if p["URL"].endswith("/" + child.data):
+ if package_id:
+ show_package_content(
+ p["URL"], p.get("Digest"), p.get("Size")
+ )
+ else:
+ print(id, p["URL"])
+
+
+def show_products(products, filter=None):
+ for key, product in products.items():
+ metadata_url = product.get("ServerMetadataURL", "")
+ if metadata_url and (not filter or filter in metadata_url):
+ metadata = get_plist_at(metadata_url)
+ localization = get_english(metadata.get("localization", {}), {})
+ title = localization.get("title", None)
+ version = metadata.get("CFBundleShortVersionString", None)
+ print(key, title, version)
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "--catalog",
+ help="URL of the catalog",
+ default="https://swscan.apple.com/content/catalogs/others/index-13-12-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog",
+ )
+ parser.add_argument(
+ "--filter", help="Only show entries with metadata url matching the filter"
+ )
+ parser.add_argument(
+ "what", nargs="?", help="Show packages information about the given entry"
+ )
+ args = parser.parse_args()
+
+ data = get_plist_at(args.catalog)
+ products = data["Products"]
+
+ if args.what:
+ if args.filter:
+ print(
+ "Cannot use --filter when showing verbose information about an entry",
+ file=sys.stderr,
+ )
+ sys.exit(1)
+ product_id, _, package_id = args.what.partition("/")
+ show_product_info(products[product_id], package_id)
+ else:
+ show_products(products, args.filter)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/build/macosx/cross-mozconfig.common b/build/macosx/cross-mozconfig.common
new file mode 100644
index 0000000000..cf087ee771
--- /dev/null
+++ b/build/macosx/cross-mozconfig.common
@@ -0,0 +1,32 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+. "$topsrcdir/build/mozconfig.common"
+
+# cctools for ld, ar, and other related tools ; dsymutil for rust.
+mk_add_options "export PATH=$MOZ_FETCHES_DIR/cctools/bin:$MOZ_FETCHES_DIR/binutils/bin:$MOZ_FETCHES_DIR/clang/bin:$PATH"
+
+# dsymutil needs a libstdc++ more recent than what's on the system.
+mk_add_options "export LD_LIBRARY_PATH=$MOZ_FETCHES_DIR/clang/lib"
+
+export CFLAGS="$CFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}"
+export CXXFLAGS="$CXXFLAGS -fcrash-diagnostics-dir=${UPLOAD_PATH}"
+export MKFSHFS=$MOZ_FETCHES_DIR/hfsplus/newfs_hfs
+export DMG_TOOL=$MOZ_FETCHES_DIR/dmg/dmg
+export HFS_TOOL=$MOZ_FETCHES_DIR/dmg/hfsplus
+
+export HOST_CFLAGS="-g"
+export HOST_CXXFLAGS="-g"
+export HOST_LDFLAGS="-g"
+
+ac_add_options --target=x86_64-apple-darwin
+
+if [ "x$MOZ_PKG_SPECIAL" != "xasan" -a -z "$MOZ_AUTOMATION_ARTIFACT_BUILDS" ]; then
+ # Enable static analysis checks by default on OSX cross builds.
+ # Exception is ASan, where this breaks.
+ # The option is not valid on artifact builds, so don't add it there either.
+ ac_add_options --enable-clang-plugin
+fi
+
+unset MOZ_STDCXX_COMPAT
diff --git a/build/macosx/mozconfig.common b/build/macosx/mozconfig.common
new file mode 100644
index 0000000000..d92816b00c
--- /dev/null
+++ b/build/macosx/mozconfig.common
@@ -0,0 +1,11 @@
+if test `uname -s` = Linux; then
+ . $topsrcdir/build/macosx/cross-mozconfig.common
+fi
+
+if [ -n "$TASKCLUSTER_PGO_PROFILE_USE" -a -z "$USE_ARTIFACT" ]; then
+ # Work around https://github.com/llvm/llvm-project/issues/57734
+ export LDFLAGS=-Wl,-mllvm,--opaque-pointers
+
+ # Keep using ld64 on PGO/LTO builds because of performance regressions when using lld.
+ ac_add_options --enable-linker=ld64
+fi
diff --git a/build/macosx/permissions/chown_revert.c b/build/macosx/permissions/chown_revert.c
new file mode 100644
index 0000000000..72dc1e64d5
--- /dev/null
+++ b/build/macosx/permissions/chown_revert.c
@@ -0,0 +1,18 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <unistd.h>
+#include <stdio.h>
+
+int main(int argc, char** argv) {
+ if (argc != 2) return 1;
+
+ uid_t realuser = getuid();
+ char uidstring[20];
+ snprintf(uidstring, 19, "%i", realuser);
+ uidstring[19] = '\0';
+
+ return execl("/usr/sbin/chown", "/usr/sbin/chown", "-R", "-h", uidstring,
+ argv[1], (char*)0);
+}
diff --git a/build/macosx/permissions/chown_root.c b/build/macosx/permissions/chown_root.c
new file mode 100644
index 0000000000..e2ef111c7f
--- /dev/null
+++ b/build/macosx/permissions/chown_root.c
@@ -0,0 +1,12 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include <unistd.h>
+
+int main(int argc, char** argv) {
+ if (argc != 2) return 1;
+
+ return execl("/usr/sbin/chown", "/usr/sbin/chown", "-R", "-h", "root:admin",
+ argv[1], (char*)0);
+}