From 042a4730e345ac0ee58a43bfedd11a7d32efb490 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 15 Jun 2014 19:52:00 -0700 Subject: [PATCH] Proper exiting for forked process in do_install() --- lib/spack/spack/package.py | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py index 069c66f4a7..fff471599a 100644 --- a/lib/spack/spack/package.py +++ b/lib/spack/spack/package.py @@ -651,18 +651,18 @@ def do_install(self, **kwargs): raise InstallError("Unable to fork build process: %s" % e) if pid == 0: - tty.msg("Building %s." % self.name) - - # create the install directory (allow the layout to handle - # this in case it needs to add extra files) - spack.install_layout.make_path_for_spec(self.spec) - - # Set up process's build environment before running install. - build_env.set_compiler_environment_variables(self) - build_env.set_build_environment_variables(self) - build_env.set_module_variables_for_package(self) - try: + tty.msg("Building %s." % self.name) + + # create the install directory (allow the layout to handle + # this in case it needs to add extra files) + spack.install_layout.make_path_for_spec(self.spec) + + # Set up process's build environment before running install. + build_env.set_compiler_environment_variables(self) + build_env.set_build_environment_variables(self) + build_env.set_module_variables_for_package(self) + # Subclasses implement install() to do the build & # install work. self.install(self.spec, self.prefix) @@ -693,7 +693,11 @@ def do_install(self, **kwargs): "Spack will think this package is installed." + "Manually remove this directory to fix:", self.prefix) - raise + + # Child doesn't raise or return to main spack code. + # Just runs default exception handler and exits. + sys.excepthook(*sys.exc_info()) + os._exit(1) # Parent process just waits for the child to complete. If the # child exited badly, assume it already printed an appropriate @@ -727,7 +731,7 @@ def do_uninstall(self, **kwargs): force = kwargs.get('force', False) if not self.installed: - raise InstallError(self.spec + " is not installed.") + raise InstallError(str(self.spec) + " is not installed.") if not force: deps = self.installed_dependents