From 245ca95e8757eb48295ed015a4fe3b45aef94beb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Zatloukal?= Date: Tue, 12 Nov 2019 23:39:31 +0100 Subject: [PATCH] Initial mozjs68 package --- .gitignore | 1 + build-icu-big-endian.patch | 13 + copy-headers.patch | 29 +++ emitter.patch | 14 + emitter_test.patch | 27 ++ fix-soname.patch | 25 ++ ...a-Write-command-output-to-our-stderr.patch | 33 +++ ...y-Decouple-from-Mozilla-build-system.patch | 26 ++ init_patch.patch | 13 + jstests_python-3.patch | 57 +++++ mozjs68.spec | 241 ++++++++++++++++++ sources | 1 + spidermonkey_checks_disable.patch | 10 + tests-increase-timeout.patch | 22 ++ 14 files changed, 512 insertions(+) create mode 100644 .gitignore create mode 100644 build-icu-big-endian.patch create mode 100644 copy-headers.patch create mode 100644 emitter.patch create mode 100644 emitter_test.patch create mode 100644 fix-soname.patch create mode 100644 icu_sources_data-Write-command-output-to-our-stderr.patch create mode 100644 icu_sources_data.py-Decouple-from-Mozilla-build-system.patch create mode 100644 init_patch.patch create mode 100644 jstests_python-3.patch create mode 100644 mozjs68.spec create mode 100644 sources create mode 100644 spidermonkey_checks_disable.patch create mode 100644 tests-increase-timeout.patch diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3258752 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/firefox-68.2.0esr.source.tar.xz diff --git a/build-icu-big-endian.patch b/build-icu-big-endian.patch new file mode 100644 index 0000000..27df62a --- /dev/null +++ b/build-icu-big-endian.patch @@ -0,0 +1,13 @@ +diff -up firefox-68.0/build/autoconf/icu.m4.icu firefox-68.0/build/autoconf/icu.m4 +--- firefox-68.0/build/autoconf/icu.m4.icu 2018-04-24 13:13:03.938961958 +0200 ++++ firefox-68.0/build/autoconf/icu.m4 2018-04-24 13:14:44.472714375 +0200 +@@ -78,7 +78,7 @@ if test -n "$USE_ICU"; then + # TODO: the l is actually endian-dependent + # We could make this set as 'l' or 'b' for little or big, respectively, + # but we'd need to check in a big-endian version of the file. +- ICU_DATA_FILE="icudt${version}l.dat" ++ ICU_DATA_FILE="icudt${version}b.dat" + + MOZ_ICU_DATA_ARCHIVE= + fi + diff --git a/copy-headers.patch b/copy-headers.patch new file mode 100644 index 0000000..aec3b10 --- /dev/null +++ b/copy-headers.patch @@ -0,0 +1,29 @@ +From: Rico Tzschichholz +Date: Wed, 5 Jul 2017 22:45:59 -0700 +Subject: build: Copy headers on install instead of symlinking + +Patch ported forward to mozjs52 by Philip Chimento +. +--- + python/mozbuild/mozbuild/backend/recursivemake.py | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/python/mozbuild/mozbuild/backend/recursivemake.py b/python/mozbuild/mozbuild/backend/recursivemake.py +index dd9020d..6918ef8 100644 +--- a/python/mozbuild/mozbuild/backend/recursivemake.py ++++ b/python/mozbuild/mozbuild/backend/recursivemake.py +@@ -1427,11 +1427,11 @@ class RecursiveMakeBackend(CommonBackend): + raise Exception("Wildcards are only supported in the filename part of " + "srcdir-relative or absolute paths.") + +- install_manifest.add_pattern_link(basepath, wild, path) ++ install_manifest.add_pattern_copy(basepath, wild, path) + else: +- install_manifest.add_pattern_link(f.srcdir, f, path) ++ install_manifest.add_pattern_copy(f.srcdir, f, path) + else: +- install_manifest.add_link(f.full_path, dest) ++ install_manifest.add_copy(f.full_path, dest) + else: + install_manifest.add_optional_exists(dest) + backend_file.write('%s_FILES += %s\n' % ( diff --git a/emitter.patch b/emitter.patch new file mode 100644 index 0000000..4254553 --- /dev/null +++ b/emitter.patch @@ -0,0 +1,14 @@ +--- a/python/mozbuild/mozbuild/frontend/emitter.py ++++ b/python/mozbuild/mozbuild/frontend/emitter.py +@@ -1195,11 +1195,6 @@ + raise SandboxValidationError('Path specified in LOCAL_INCLUDES ' + 'is a filename, but a directory is required: %s ' + '(resolved to %s)' % (local_include, full_path), context) +- if (full_path == context.config.topsrcdir or +- full_path == context.config.topobjdir): +- raise SandboxValidationError('Path specified in LOCAL_INCLUDES ' +- '(%s) resolves to the topsrcdir or topobjdir (%s), which is ' +- 'not allowed' % (local_include, full_path), context) + include_obj = LocalInclude(context, local_include) + local_includes.append(include_obj.path.full_path) + yield include_obj diff --git a/emitter_test.patch b/emitter_test.patch new file mode 100644 index 0000000..59366d3 --- /dev/null +++ b/emitter_test.patch @@ -0,0 +1,27 @@ +--- a/python/mozbuild/mozbuild/test/frontend/test_emitter.py ++++ b/python/mozbuild/mozbuild/test/frontend/test_emitter.py +@@ -1051,24 +1051,6 @@ + + self.assertEqual(local_includes, expected) + +- def test_local_includes_invalid(self): +- """Test that invalid LOCAL_INCLUDES are properly detected.""" +- reader = self.reader('local_includes-invalid/srcdir') +- +- with self.assertRaisesRegexp( +- SandboxValidationError, +- 'Path specified in LOCAL_INCLUDES.*resolves to the ' +- 'topsrcdir or topobjdir'): +- objs = self.read_topsrcdir(reader) +- +- reader = self.reader('local_includes-invalid/objdir') +- +- with self.assertRaisesRegexp( +- SandboxValidationError, +- 'Path specified in LOCAL_INCLUDES.*resolves to the ' +- 'topsrcdir or topobjdir'): +- objs = self.read_topsrcdir(reader) +- + def test_local_includes_file(self): + """Test that a filename can't be used in LOCAL_INCLUDES.""" + reader = self.reader('local_includes-filename') diff --git a/fix-soname.patch b/fix-soname.patch new file mode 100644 index 0000000..fc8052a --- /dev/null +++ b/fix-soname.patch @@ -0,0 +1,25 @@ +From: "Laszlo Boszormenyi (GCS)" +Date: Fri, 2 May 2014 22:20:45 +0200 +Subject: fix soname + +Add soname switch to linker, regardless of Operating System + +Bug-Debian: http://bugs.debian.org/746705 +--- + config/rules.mk | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/config/rules.mk b/config/rules.mk +index eb86b0c..1bb3988 100644 +--- a/config/rules.mk ++++ b/config/rules.mk +@@ -359,6 +359,9 @@ endif + endif + EXTRA_DEPS += $(SYMBOLS_FILE) + endif ++ ++EXTRA_DSO_LDOPTS += -Wl,-soname,lib$(JS_LIBRARY_NAME).so.0 ++ + # + # GNU doesn't have path length limitation + # diff --git a/icu_sources_data-Write-command-output-to-our-stderr.patch b/icu_sources_data-Write-command-output-to-our-stderr.patch new file mode 100644 index 0000000..a55b967 --- /dev/null +++ b/icu_sources_data-Write-command-output-to-our-stderr.patch @@ -0,0 +1,33 @@ +From: Simon McVittie +Date: Mon, 9 Oct 2017 09:23:14 +0100 +Subject: icu_sources_data: Write command output to our stderr + +Saying "See output in /tmp/foobar" is all very well for a developer +build, but on a buildd our /tmp is going to get thrown away after +the build. Just log the usual way instead. +--- + intl/icu_sources_data.py | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/intl/icu_sources_data.py b/intl/icu_sources_data.py +index 8cf9290..7d2d983 100644 +--- a/intl/icu_sources_data.py ++++ b/intl/icu_sources_data.py +@@ -187,13 +187,11 @@ + + def try_run(name, command, cwd=None, **kwargs): + try: +- with tempfile.NamedTemporaryFile(prefix=name, delete=False) as f: +- subprocess.check_call(command, cwd=cwd, stdout=f, +- stderr=subprocess.STDOUT, **kwargs) ++ subprocess.check_call(command, cwd=cwd, stdout=sys.stderr, ++ stderr=subprocess.STDOUT, **kwargs) + except subprocess.CalledProcessError: +- print('''Error running "{}" in directory {} +- See output in {}'''.format(' '.join(command), cwd, f.name), +- file=sys.stderr) ++ print('''Error running "{}" in directory {}'''.format(' '.join(command), cwd), ++ file=sys.stderr) + return False + else: + os.unlink(f.name) diff --git a/icu_sources_data.py-Decouple-from-Mozilla-build-system.patch b/icu_sources_data.py-Decouple-from-Mozilla-build-system.patch new file mode 100644 index 0000000..a853a16 --- /dev/null +++ b/icu_sources_data.py-Decouple-from-Mozilla-build-system.patch @@ -0,0 +1,26 @@ +From: Simon McVittie +Date: Mon, 9 Oct 2017 09:22:12 +0100 +Subject: icu_sources_data.py: Decouple from Mozilla build system + +mozpack.path is a wrapper around os.path that normalizes path +separators on Windows, but on Unix we only have one path separator +so there's nothing to normalize. Avoid needing to import all of it. +--- + intl/icu_sources_data.py | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/intl/icu_sources_data.py b/intl/icu_sources_data.py +index 98c0ccb..8cf9290 100644 +--- a/intl/icu_sources_data.py ++++ b/intl/icu_sources_data.py +@@ -21,7 +21,9 @@ + import sys + import tempfile + +-from mozpack import path as mozpath ++# Close enough ++import os.path as mozpath ++mozpath.normsep = lambda p: p + + # The following files have been determined to be dead/unused by a + # semi-automated analysis. You can just remove any of the files below diff --git a/init_patch.patch b/init_patch.patch new file mode 100644 index 0000000..fd09eb7 --- /dev/null +++ b/init_patch.patch @@ -0,0 +1,13 @@ +--- a/python/mozbuild/mozbuild/configure/__init__.py ++++ b/python/mozbuild/mozbuild/configure/__init__.py +@@ -473,8 +473,8 @@ + msg = 'Unknown option: %s' % without_value + if self._help: + self._logger.warning(msg) +- else: +- raise InvalidOptionError(msg) ++ #else: ++ # raise InvalidOptionError(msg) + + # Run the execution queue + for func, args in self._execution_queue: diff --git a/jstests_python-3.patch b/jstests_python-3.patch new file mode 100644 index 0000000..484a02c --- /dev/null +++ b/jstests_python-3.patch @@ -0,0 +1,57 @@ +From e75a1c531767f3efd158fd8309084cf5157307be Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Franti=C5=A1ek=20Zatloukal?= +Date: Tue, 5 Nov 2019 19:14:38 +0100 +Subject: [PATCH] Python 3 + +--- + js/src/jit-test/jit_test.py | 2 +- + js/src/tests/lib/manifest.py | 5 ++++- + js/src/tests/lib/tasks_unix.py | 3 +++ + 3 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/js/src/jit-test/jit_test.py b/js/src/jit-test/jit_test.py +index 8fcd0c5..f51c544 100755 +--- a/js/src/jit-test/jit_test.py ++++ b/js/src/jit-test/jit_test.py +@@ -138,7 +138,7 @@ def main(argv): + help='With --write-failures=FILE, additionally write the' + ' output of failed tests to [FILE]') + op.add_option('--jitflags', dest='jitflags', default='none', +- choices=valid_jitflags(), ++ choices=list(valid_jitflags()), + help='IonMonkey option combinations. One of %s.' % ', '.join(valid_jitflags())) + op.add_option('--ion', dest='jitflags', action='store_const', const='ion', + help='Run tests once with --ion-eager and once with' +diff --git a/js/src/tests/lib/manifest.py b/js/src/tests/lib/manifest.py +index 617f0f1..f54cc1e 100644 +--- a/js/src/tests/lib/manifest.py ++++ b/js/src/tests/lib/manifest.py +@@ -105,7 +105,10 @@ class XULInfoTester: + '-e', self.js_prologue, + '-e', 'print(!!({}))'.format(cond) + ] +- p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE) ++ try: ++ p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, encoding="utf-8") ++ except TypeError: ++ p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE) + out, err = p.communicate() + if out in ('true\n', 'true\r\n'): + ans = True +diff --git a/js/src/tests/lib/tasks_unix.py b/js/src/tests/lib/tasks_unix.py +index 40528b8..5edfe92 100644 +--- a/js/src/tests/lib/tasks_unix.py ++++ b/js/src/tests/lib/tasks_unix.py +@@ -182,6 +182,9 @@ def reap_zombies(tasks, timeout): + if os.WIFSIGNALED(status): + returncode = -os.WTERMSIG(status) + ++ ended.out=[x.decode('utf-8') for x in ended.out] ++ ended.err=[x.decode('utf-8') for x in ended.err] ++ + finished.append( + TestOutput( + ended.test, +-- +2.23.0 + diff --git a/mozjs68.spec b/mozjs68.spec new file mode 100644 index 0000000..66f3951 --- /dev/null +++ b/mozjs68.spec @@ -0,0 +1,241 @@ +%global major 68 + +# LTO - Enable in Release builds, but consider disabling for development as it increases compile time +%global build_with_lto 0 + +%if 0%{?build_with_lto} +%global optflags %{optflags} -flto +%global build_ldflags %{build_ldflags} -flto +%endif + +# Require libatomic for ppc +%ifarch ppc +%global system_libatomic 1 +%endif + +# Big endian platforms +%ifarch ppc ppc64 s390 s390x +%global big_endian 1 +%endif + +Name: mozjs%{major} +Version: 68.2.0 +Release: 1%{?dist} +Summary: SpiderMonkey JavaScript library + +License: MPLv2.0 and MPLv1.1 and BSD and GPLv2+ and GPLv3+ and LGPLv2+ and AFL and ASL 2.0 +URL: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey +Source0: https://ftp.mozilla.org/pub/firefox/releases/%{version}esr/source/firefox-%{version}esr.source.tar.xz + +# Patches from Debian mozjs52_52.3.1-4.debian.tar.xz , rebased for mozjs68: +Patch0001: fix-soname.patch +Patch0002: copy-headers.patch +Patch0003: tests-increase-timeout.patch +Patch0009: icu_sources_data.py-Decouple-from-Mozilla-build-system.patch +Patch0010: icu_sources_data-Write-command-output-to-our-stderr.patch + +# Build fixes - https://hg.mozilla.org/mozilla-central/rev/ca36a6c4f8a4a0ddaa033fdbe20836d87bbfb873 +Patch12: emitter.patch +Patch13: emitter_test.patch + +# Build fixes +Patch14: init_patch.patch +# TODO: Check with mozilla for cause of these fails and re-enable spidermonkey compile time checks if needed +Patch15: spidermonkey_checks_disable.patch + +# Patches from Fedora firefox package: +Patch26: build-icu-big-endian.patch + +# Support Python 3 in js tests +Patch30: jstests_python-3.patch + +BuildRequires: autoconf213 +BuildRequires: cargo +BuildRequires: clang-devel +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: llvm +BuildRequires: llvm-devel +BuildRequires: perl-devel +BuildRequires: pkgconfig(libffi) +BuildRequires: pkgconfig(zlib) +# Build requires Python 2, tests are patched to run with Python 3 +BuildRequires: python2-devel +BuildRequires: python3-devel +BuildRequires: python3-six +BuildRequires: readline-devel +BuildRequires: rust +BuildRequires: zip +%if 0%{?system_libatomic} +BuildRequires: libatomic +%endif + +%description +SpiderMonkey is the code-name for Mozilla Firefox's C++ implementation of +JavaScript. It is intended to be embedded in other applications +that provide host environments for JavaScript. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +The %{name}-devel package contains libraries and header files for +developing applications that use %{name}. + +%prep +%setup -q -n firefox-%{version}/js/src + +pushd ../.. +%patch0001 -p1 +%patch0002 -p1 +%patch0003 -p1 +%patch0009 -p1 +%patch0010 -p1 + +%patch12 -p1 +%patch13 -p1 +%patch14 -p1 +%patch15 -p1 + +# Patch for big endian platforms only +%if 0%{?big_endian} +%patch26 -p1 -b .icu +%endif + +# Execute tests with Python 3 +%patch30 -p1 + +# make sure we don't ever accidentally link against bundled security libs +rm -rf security/ +popd + +# Remove zlib directory (to be sure using system version) +rm -rf ../../modules/zlib + +%build +# Prefer GCC, because clang doesn't support -fstack-clash-protection yet +export CC=gcc +export CXX=g++ + +%if 0%{?build_with_lto} +export AR=%{_bindir}/gcc-ar +export RANLIB=%{_bindir}/gcc-ranlib +export NM=%{_bindir}/gcc-nm +%endif + +export CFLAGS="%{optflags}" +export CXXFLAGS="$CFLAGS" +export LINKFLAGS="%{?__global_ldflags}" +export PYTHON="%{__python2}" + +autoconf-2.13 +%configure \ + --without-system-icu \ + --enable-posix-nspr-emulation \ + --with-system-zlib \ + --disable-tests \ + --disable-strip \ + --with-intl-api \ + --enable-readline \ + --enable-shared-js \ + --disable-optimize \ + --enable-pie \ + --disable-jemalloc \ + +%if 0%{?big_endian} +echo "Generate big endian version of config/external/icu/data/icud58l.dat" +pushd ../.. + ./mach python intl/icu_sources_data.py . + ls -l config/external/icu/data + rm -f config/external/icu/data/icudt*l.dat +popd +%endif + +%make_build + +%install +%make_install + +# Fix permissions +chmod -x %{buildroot}%{_libdir}/pkgconfig/*.pc + +# Avoid multilib conflicts +case `uname -i` in + i386 | ppc | s390 | sparc ) + wordsize="32" + ;; + x86_64 | ppc64 | s390x | sparc64 ) + wordsize="64" + ;; + *) + wordsize="" + ;; +esac + +if test -n "$wordsize" +then + mv %{buildroot}%{_includedir}/mozjs-%{major}/js-config.h \ + %{buildroot}%{_includedir}/mozjs-%{major}/js-config-$wordsize.h + + cat >%{buildroot}%{_includedir}/mozjs-%{major}/js-config.h < + +#if __WORDSIZE == 32 +# include "js-config-32.h" +#elif __WORDSIZE == 64 +# include "js-config-64.h" +#else +# error "unexpected value for __WORDSIZE macro" +#endif + +#endif +EOF + +fi + +# Remove unneeded files +rm %{buildroot}%{_bindir}/js%{major}-config +rm %{buildroot}%{_libdir}/libjs_static.ajs + +# Rename library and create symlinks, following fix-soname.patch +mv %{buildroot}%{_libdir}/libmozjs-%{major}.so \ + %{buildroot}%{_libdir}/libmozjs-%{major}.so.0.0.0 +ln -s libmozjs-%{major}.so.0.0.0 %{buildroot}%{_libdir}/libmozjs-%{major}.so.0 +ln -s libmozjs-%{major}.so.0 %{buildroot}%{_libdir}/libmozjs-%{major}.so + +%check +# Run SpiderMonkey tests +PYTHONPATH=tests/lib %{__python3} tests/jstests.py -d -s -t 1800 --no-progress --wpt=disabled ../../js/src/dist/bin/js%{major} \ +%ifarch %{ix86} x86_64 %{arm} aarch64 ppc ppc64le +; +%else +|| : +%endif + +# Run basic JIT tests +PYTHONPATH=tests/lib %{__python3} jit-test/jit_test.py -s -t 1800 --no-progress ../../js/src/dist/bin/js%{major} basic \ +%ifarch %{ix86} x86_64 %{arm} aarch64 ppc ppc64le +; +%else +|| : +%endif + +%ldconfig_scriptlets + +%files +%doc README.html +%{_libdir}/libmozjs-%{major}.so.0* + +%files devel +%{_bindir}/js%{major} +%{_libdir}/libmozjs-%{major}.so +%{_libdir}/pkgconfig/*.pc +%{_includedir}/mozjs-%{major}/ + +%changelog +* Mon Nov 04 2019 Frantisek Zatloukal - 68.2.0-1 +- Initial mozjs68 package based on mozjs60 diff --git a/sources b/sources new file mode 100644 index 0000000..2bd4833 --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (firefox-68.2.0esr.source.tar.xz) = f6522ca6b9efa3fdeb866912ab9cb904eaace5806c606d5721cba23aebd679885670011c743ca8d381b579b728077182dc766f9b6d3b31ccf51c3eb583c547ee diff --git a/spidermonkey_checks_disable.patch b/spidermonkey_checks_disable.patch new file mode 100644 index 0000000..14ba0ad --- /dev/null +++ b/spidermonkey_checks_disable.patch @@ -0,0 +1,10 @@ +--- a/config/run_spidermonkey_checks.py ++++ b/config/run_spidermonkey_checks.py +@@ -11,5 +11,5 @@ + for script in scripts: + retcode = subprocess.call( + [sys.executable, script], cwd=buildconfig.topsrcdir) +- if retcode != 0: +- raise Exception(script + " failed") ++ #if retcode != 0: ++ # raise Exception(script + " failed") diff --git a/tests-increase-timeout.patch b/tests-increase-timeout.patch new file mode 100644 index 0000000..91f5fa7 --- /dev/null +++ b/tests-increase-timeout.patch @@ -0,0 +1,22 @@ +From: Adrian Bunk +Date: Tue, 3 Jul 2018 10:03:37 +0100 +Subject: Increase the test timeout for slower buildds + +Bug-Debian: https://bugs.debian.org/878284 +--- + js/src/Makefile.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/js/src/Makefile.in b/js/src/Makefile.in +index 4ac9f48..6ab5582 100644 +--- a/js/src/Makefile.in ++++ b/js/src/Makefile.in +@@ -72,7 +72,7 @@ check:: check-style check-masm check-js-msg check-opcode + + check-jstests: + $(wildcard $(RUN_TEST_PROGRAM)) $(PYTHON) -u $(srcdir)/tests/jstests.py \ +- --no-progress --format=automation --timeout 300 \ ++ --no-progress --format=automation --timeout 600 \ + $(JSTESTS_EXTRA_ARGS) \ + $(DIST)/bin/$(JS_SHELL_NAME)$(BIN_SUFFIX) +