diff --git a/build/build.pl b/build/build.pl index 6b0d78f..07dea00 100755 --- a/build/build.pl +++ b/build/build.pl @@ -92,8 +92,16 @@ my $needs_reconfig = !!$opts{reconfig}; # Emscripten's fork() (and system()) stubs return EAGAIN, meaning "Resource temporarily unavailable". # So perl will wait 5 seconds and try again, which is not helpful to us, since Emscripten doesn't support those functions at all. # This patch fixes that on the Emscripten side, so the stubs return ENOTSUP. + # first, we need to take a guess which version of the patch to apply. + my $libraryjs = file($ENV{EMSCRIPTEN}, 'src', 'library.js')->slurp; + my $patchf; + if ( $libraryjs=~/\b\QERRNO_CODES.EAGAIN\E\b/ ) + { $patchf = 'emscripten_1.38.10_eagain.patch' } + elsif ( $libraryjs=~/\b\QcDefine('EAGAIN')\E/ ) + { $patchf = 'emscripten_1.38.28_eagain.patch' } + else { die "Could not figure out which library.js patch to use" } #TODO Later: we should probably verify the Emscripten version too, and in the future we may need different patches for different versions - if ( try_patch_file( file($FindBin::Bin,'emscripten_1.38.10_eagain.patch') ) ) { + if ( try_patch_file( file($FindBin::Bin,$patchf) ) ) { say STDERR "# Emscripten was newly patched, forcing a rebuild"; # not sure if the following is needed, but playing it safe: run 'emcc', '--clear-cache'; # force Emscripten to rebuild libs (takes a bit of time) diff --git a/build/emperl_config.sh b/build/emperl_config.sh index 8aa4cd0..9bc9562 100755 --- a/build/emperl_config.sh +++ b/build/emperl_config.sh @@ -29,13 +29,18 @@ export EMPERL_OUTPUTDIR="$BASEDIR/work/outputperl" # Note to self: In build.pl, we take advantage of the fact that on Perls >=v5.10.0, "$^V" is the same as the tag name. export EMPERL_PERLVER="v5.28.0" export EMPERL_PREFIX="/opt/perl" +# Note: strace shows this is how file_packager.py is called: ["/usr/bin/python", "/home/haukex/emsdk/emscripten/1.38.28/tools/file_packager.py", "emperl.data", "--from-emcc", "--export-name=Module", "--preload", "/home/haukex/code/webperl/work/outputperl/opt/perl@/opt/perl", "--no-heap-copy"] export EMPERL_PRELOAD_FILE="$EMPERL_OUTPUTDIR$EMPERL_PREFIX@$EMPERL_PREFIX" export EMPERL_OPTIMIZ="-O2" -export EMPERL_LINK_FLAGS="--pre-js common_preamble.js -s EXPORTED_FUNCTIONS=['_main','_emperl_end_perl','_Perl_call_sv','_Perl_call_pv','_Perl_call_method','_Perl_call_argv','_Perl_eval_pv','_Perl_eval_sv','_webperl_eval_perl'] -s EXTRA_EXPORTED_RUNTIME_METHODS=['ccall','cwrap']" +# Note: We explicitly disable ERROR_ON_UNDEFINED_SYMBOLS because it was enabled by default in Emscripten 1.38.13. +#TODO Later: Why does --no-heap-copy not get rid of the "in memory growth we are forced to copy it again" assertion warning? (https://github.com/emscripten-core/emscripten/commit/ec764ace634f13bab5ae932912da53fe93ee1b69) +export EMPERL_LINK_FLAGS="--pre-js common_preamble.js --no-heap-copy -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s EXPORTED_FUNCTIONS=['_main','_emperl_end_perl','_Perl_call_sv','_Perl_call_pv','_Perl_call_method','_Perl_call_argv','_Perl_eval_pv','_Perl_eval_sv','_webperl_eval_perl'] -s EXTRA_EXPORTED_RUNTIME_METHODS=['ccall','cwrap']" + +export EMPERL_DEBUG_FLAGS="" +#export EMPERL_DEBUG_FLAGS="-s ASSERTIONS=2 -s STACK_OVERFLOW_CHECK=2" # Note: not including "-s SAFE_HEAP=1" in the debug flags because we're building to WebAssembly, which doesn't require alignment #TODO Later: Can some of the SAFE_HEAP functionality (null pointer access I think?) be replaced by the WASM error traps? # http://kripken.github.io/emscripten-site/docs/compiling/WebAssembly.html#binaryen-codegen-options -export EMPERL_DEBUG_FLAGS="-s ASSERTIONS=2 -s STACK_OVERFLOW_CHECK=2" # Location and branch of the perl git repository that contains the emperl branch export EMPERL_PERL_REPO="https://github.com/haukex/emperl5.git" diff --git a/build/emscripten_1.38.28_eagain.patch b/build/emscripten_1.38.28_eagain.patch new file mode 100644 index 0000000..766e29b --- /dev/null +++ b/build/emscripten_1.38.28_eagain.patch @@ -0,0 +1,20 @@ +--- library.js.orig 2019-03-02 16:08:24.404047130 +0100 ++++ library.js 2019-03-02 16:19:30.588047130 +0100 +@@ -291,7 +291,7 @@ + // pid_t fork(void); + // http://pubs.opengroup.org/onlinepubs/000095399/functions/fork.html + // We don't support multiple processes. +- ___setErrNo({{{ cDefine('EAGAIN') }}}); ++ ___setErrNo({{{ cDefine('ENOTSUP') }}}); + return -1; + }, + vfork: 'fork', +@@ -817,7 +817,7 @@ + // int system(const char *command); + // http://pubs.opengroup.org/onlinepubs/000095399/functions/system.html + // Can't call external programs. +- ___setErrNo({{{ cDefine('EAGAIN') }}}); ++ ___setErrNo({{{ cDefine('ENOTSUP') }}}); + return -1; + }, +