From 203cebb0819a5b877933274dd341fa79486fc602 Mon Sep 17 00:00:00 2001 From: Danny McClanahan <1305167+cosmicexplorer@users.noreply.github.com> Date: Sat, 23 Apr 2022 14:40:22 -0400 Subject: [PATCH] make zlib and other makefile packages able to use emscripten - also, bzip2 fix --- lib/spack/spack/build_environment.py | 6 ++ lib/spack/spack/build_systems/makefile.py | 10 ++- lib/spack/spack/package.py | 5 +- .../packages/bzip2/no-tty-checking.patch | 67 +++++++++++++++++++ .../repos/builtin/packages/bzip2/package.py | 14 ++++ .../repos/builtin/packages/zlib/package.py | 9 +-- 6 files changed, 104 insertions(+), 7 deletions(-) create mode 100644 var/spack/repos/builtin/packages/bzip2/no-tty-checking.patch diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 028978e298f..d87ff8f0483 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -514,6 +514,12 @@ def _set_variables_for_single_module(pkg, module): # TODO: make these build deps that can be installed if not found. # FIXME: !!!!! m.make = MakeExecutable('make', jobs) + m.emmake = MakeExecutable('emmake', jobs) + m.emmake.add_default_arg('make') + m.emmake.add_default_arg('AR=emar') + m.emmake.add_default_arg('RANLIB=emranlib') + m.emmake.add_default_arg('NM=emnm') + m.gmake = MakeExecutable('gmake', jobs) m.scons = MakeExecutable('scons', jobs) m.ninja = MakeExecutable('ninja', jobs) diff --git a/lib/spack/spack/build_systems/makefile.py b/lib/spack/spack/build_systems/makefile.py index 75574a61309..3686baae93a 100644 --- a/lib/spack/spack/build_systems/makefile.py +++ b/lib/spack/spack/build_systems/makefile.py @@ -82,14 +82,20 @@ def build(self, spec, prefix): as targets. """ with working_dir(self.build_directory): - inspect.getmodule(self).make(*self.build_targets) + if self.spec.satisfies('%emscripten'): + inspect.getmodule(self).emmake(*self.build_targets) + else: + inspect.getmodule(self).make(*self.build_targets) def install(self, spec, prefix): """Calls make, passing :py:attr:`~.MakefilePackage.install_targets` as targets. """ with working_dir(self.build_directory): - inspect.getmodule(self).make(*self.install_targets) + if self.spec.satisfies('%emscripten'): + inspect.getmodule(self).emmake(*self.install_targets) + else: + inspect.getmodule(self).make(*self.install_targets) run_after('build')(PackageBase._run_default_build_time_test_callbacks) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 9bd7669de9b..a70d45aba87 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -1775,7 +1775,10 @@ def _if_make_target_execute(self, target, *args, **kwargs): """ if self._has_make_target(target): # Execute target - inspect.getmodule(self).make(target, *args, **kwargs) + if self.spec.satisfies('%emscripten'): + inspect.getmodule(self).emmake(target, *args, **kwargs) + else: + inspect.getmodule(self).make(target, *args, **kwargs) def _has_ninja_target(self, target): """Checks to see if 'target' is a valid target in a Ninja build script. diff --git a/var/spack/repos/builtin/packages/bzip2/no-tty-checking.patch b/var/spack/repos/builtin/packages/bzip2/no-tty-checking.patch new file mode 100644 index 00000000000..130d27a6414 --- /dev/null +++ b/var/spack/repos/builtin/packages/bzip2/no-tty-checking.patch @@ -0,0 +1,67 @@ +diff --git a/bzip2.c b/bzip2.c +index d95d280..30429ea 100644 +--- a/bzip2.c ++++ b/bzip2.c +@@ -1227,30 +1227,11 @@ void compress ( Char *name ) + case SM_I2O: + inStr = stdin; + outStr = stdout; +- if ( isatty ( fileno ( stdout ) ) ) { +- fprintf ( stderr, +- "%s: I won't write compressed data to a terminal.\n", +- progName ); +- fprintf ( stderr, "%s: For help, type: `%s --help'.\n", +- progName, progName ); +- setExit(1); +- return; +- }; + break; + + case SM_F2O: + inStr = fopen ( inName, "rb" ); + outStr = stdout; +- if ( isatty ( fileno ( stdout ) ) ) { +- fprintf ( stderr, +- "%s: I won't write compressed data to a terminal.\n", +- progName ); +- fprintf ( stderr, "%s: For help, type: `%s --help'.\n", +- progName, progName ); +- if ( inStr != NULL ) fclose ( inStr ); +- setExit(1); +- return; +- }; + if ( inStr == NULL ) { + fprintf ( stderr, "%s: Can't open input file %s: %s.\n", + progName, inName, strerror(errno) ); +@@ -1413,15 +1394,6 @@ void uncompress ( Char *name ) + case SM_I2O: + inStr = stdin; + outStr = stdout; +- if ( isatty ( fileno ( stdin ) ) ) { +- fprintf ( stderr, +- "%s: I won't read compressed data from a terminal.\n", +- progName ); +- fprintf ( stderr, "%s: For help, type: `%s --help'.\n", +- progName, progName ); +- setExit(1); +- return; +- }; + break; + + case SM_F2O: +@@ -1554,15 +1526,6 @@ void testf ( Char *name ) + switch ( srcMode ) { + + case SM_I2O: +- if ( isatty ( fileno ( stdin ) ) ) { +- fprintf ( stderr, +- "%s: I won't read compressed data from a terminal.\n", +- progName ); +- fprintf ( stderr, "%s: For help, type: `%s --help'.\n", +- progName, progName ); +- setExit(1); +- return; +- }; + inStr = stdin; + break; + diff --git a/var/spack/repos/builtin/packages/bzip2/package.py b/var/spack/repos/builtin/packages/bzip2/package.py index 6bf700127a8..6e27c333165 100644 --- a/var/spack/repos/builtin/packages/bzip2/package.py +++ b/var/spack/repos/builtin/packages/bzip2/package.py @@ -28,6 +28,8 @@ class Bzip2(Package, SourcewarePackage): variant('pic', default=False, description='Build static libraries with PIC') variant('debug', default=False, description='Enable debug symbols and disable optimization') + patch('no-tty-checking.patch', when='%emscripten') + depends_on('diffutils', type='build') @classmethod @@ -99,6 +101,9 @@ def patch(self): **kwargs) def install(self, spec, prefix): + if self.spec.satisfies('%emscripten'): + make = emmake + # Build the dynamic library first if '+shared' in spec: make('-f', 'Makefile-libbz2_so') @@ -107,6 +112,15 @@ def install(self, spec, prefix): make() make('install', 'PREFIX={0}'.format(prefix)) + if self.spec.satisfies('%emscripten'): + install('bzip2.wasm', + join_path(prefix.bin, 'bzip2.wasm')) + install('bzip2recover.wasm', + join_path(prefix.bin, 'bzip2recover.wasm')) + if '+shared' in spec: + install('bzip2-shared.wasm', + join_path(prefix.bin, 'bzip2-shared.wasm')) + if '+shared' in spec: install('bzip2-shared', join_path(prefix.bin, 'bzip2')) diff --git a/var/spack/repos/builtin/packages/zlib/package.py b/var/spack/repos/builtin/packages/zlib/package.py index 53f2cf58bd2..07a3cd6d87c 100644 --- a/var/spack/repos/builtin/packages/zlib/package.py +++ b/var/spack/repos/builtin/packages/zlib/package.py @@ -75,13 +75,14 @@ def install(self, spec, prefix): nmake('-f' 'win32\\Makefile.msc') self.win_install() else: + if self.spec.satisfies('%emscripten'): + configure = emconfigure + make = emmake + config_args = [] if '~shared' in spec: config_args.append('--static') - if self.spec.satisfies('%emscripten'): - emconfigure('--prefix={0}'.format(prefix), *config_args) - else: - configure('--prefix={0}'.format(prefix), *config_args) + configure('--prefix={0}'.format(prefix), *config_args) make() if self.run_tests: