diff options
Diffstat (limited to 'var')
-rw-r--r-- | var/spack/repos/builtin/packages/boost/package.py | 82 | ||||
-rw-r--r-- | var/spack/repos/builtin/packages/python/package.py | 19 |
2 files changed, 75 insertions, 26 deletions
diff --git a/var/spack/repos/builtin/packages/boost/package.py b/var/spack/repos/builtin/packages/boost/package.py index 366a14509a..fe0d392857 100644 --- a/var/spack/repos/builtin/packages/boost/package.py +++ b/var/spack/repos/builtin/packages/boost/package.py @@ -5,6 +5,7 @@ import os import sys +from pathlib import Path from spack.package import * @@ -303,6 +304,11 @@ class Boost(Package): # safe to do so on affected platforms. conflicts("+clanglibcpp", when="@1.85: +stacktrace") + # On Windows, the signals variant is required when building any of + # the all_libs variants. + for lib in all_libs: + requires("+signals", when=f"+{lib} platform=windows") + # Patch fix from https://svn.boost.org/trac/boost/ticket/11856 patch("boost_11856.patch", when="@1.60.0%gcc@4.4.7") @@ -495,9 +501,9 @@ class Boost(Package): return "using python : {0} : {1} : {2} : {3} ;\n".format( spec["python"].version.up_to(2), - spec["python"].command.path, - spec["python"].headers.directories[0], - spec["python"].libs[0], + Path(spec["python"].command.path).as_posix(), + Path(spec["python"].headers.directories[0]).as_posix(), + Path(spec["python"].libs[0]).parent.as_posix(), ) def determine_bootstrap_options(self, spec, with_libs, options): @@ -521,6 +527,9 @@ class Boost(Package): else: options.append("--without-icu") + self.write_jam_file(spec, boost_toolset_id) + + def write_jam_file(self, spec, boost_toolset_id=None): with open("user-config.jam", "w") as f: # Boost may end up using gcc even though clang+gfortran is set in # compilers.yaml. Make sure this does not happen: @@ -535,7 +544,7 @@ class Boost(Package): # similar, but that doesn't work with the Cray compiler # wrappers. Since Boost doesn't use the MPI C++ bindings, # that can be used as a compiler option instead. - mpi_line = "using mpi : %s" % spec["mpi"].mpicxx + mpi_line = "using mpi : %s" % Path(spec["mpi"].mpicxx).as_posix() f.write(mpi_line + " ;\n") if spec.satisfies("+python"): @@ -608,6 +617,16 @@ class Boost(Package): options.extend(["link=%s" % ",".join(link_types), "--layout=%s" % layout]) + if spec.satisfies("platform=windows"): + # The runtime link must either be shared or static, not both. + if "+shared" in spec: + options.append("runtime-link=shared") + else: + options.append("runtime-link=static") + for lib in self.all_libs: + if f"+{lib}" not in spec: + options.append(f"--without-{lib}") + if not spec.satisfies("@:1.75 %intel") and not spec.satisfies("platform=windows"): # When building any version >= 1.76, the toolset must be specified. # Earlier versions could not specify Intel as the toolset @@ -671,6 +690,23 @@ class Boost(Package): prefix, remainder = lib.split(".", 1) symlink(lib, "%s-mt.%s" % (prefix, remainder)) + def bootstrap_windows(self): + """Run the Windows-specific bootstrap.bat. The only bootstrapping command + line option that is accepted by the bootstrap.bat script is the compiler + information: either the vc version (e.g. MSVC 14.3.x would be vc143) + or gcc or clang. + """ + bootstrap_options = list() + if self.spec.satisfies("%msvc"): + bootstrap_options.append(f"vc{self.compiler.platform_toolset_ver}") + elif self.spec.satisfies("%gcc"): + bootstrap_options.append("gcc") + elif self.spec.satisfies("%clang"): + bootstrap_options.append("clang") + + bootstrap = Executable("cmd.exe") + bootstrap("/c", ".\\bootstrap.bat", *bootstrap_options) + def install(self, spec, prefix): # On Darwin, Boost expects the Darwin libtool. However, one of the # dependencies may have pulled in Spack's GNU libtool, and these two @@ -710,16 +746,13 @@ class Boost(Package): if spec.satisfies("+graph") and spec.satisfies("+mpi"): with_libs.add("graph_parallel") - # to make Boost find the user-config.jam - env["BOOST_BUILD_PATH"] = self.stage.source_path - - bootstrap_options = ["--prefix=%s" % prefix] - self.determine_bootstrap_options(spec, with_libs, bootstrap_options) - if self.spec.satisfies("platform=windows"): - bootstrap = Executable("cmd.exe") - bootstrap("/c", ".\\bootstrap.bat", *bootstrap_options) + self.bootstrap_windows() else: + # to make Boost find the user-config.jam + env["BOOST_BUILD_PATH"] = self.stage.source_path + bootstrap_options = ["--prefix=%s" % prefix] + self.determine_bootstrap_options(spec, with_libs, bootstrap_options) bootstrap = Executable("./bootstrap.sh") bootstrap(*bootstrap_options) @@ -742,15 +775,24 @@ class Boost(Package): if jobs > 64 and spec.satisfies("@:1.58"): jobs = 64 - # Windows just wants a b2 call with no args - b2_options = [] - if not self.spec.satisfies("platform=windows"): - path_to_config = "--user-config=%s" % os.path.join( - self.stage.source_path, "user-config.jam" - ) - b2_options = ["-j", "%s" % jobs] - b2_options.append(path_to_config) + if self.spec.satisfies("platform=windows"): + + def is_64bit(): + # TODO: This method should be abstracted to a more general location + # as it is repeated in many places (msmpi.py for one) + return "64" in str(self.spec.target.family) + b2_options = [f"--prefix={self.prefix}", f"address-model={64 if is_64bit() else 32}"] + if not self.spec.satisfies("+python"): + b2_options.append("--without-python") + + self.write_jam_file(self.spec) + else: + b2_options = ["-j", "%s" % jobs] + path_to_config = "--user-config=%s" % os.path.join( + self.stage.source_path, "user-config.jam" + ) + b2_options.append(path_to_config) threading_opts = self.determine_b2_options(spec, b2_options) # Create headers if building from a git checkout diff --git a/var/spack/repos/builtin/packages/python/package.py b/var/spack/repos/builtin/packages/python/package.py index 79a8ad2cdc..60f403483e 100644 --- a/var/spack/repos/builtin/packages/python/package.py +++ b/var/spack/repos/builtin/packages/python/package.py @@ -1023,8 +1023,13 @@ print(json.dumps(config)) win_root_dir, ] - # The Python shipped with Xcode command line tools isn't in any of these locations - for subdir in ["lib", "lib64"]: + if self.spec.satisfies("platform=windows"): + lib_dirs = ["libs"] + else: + # The Python shipped with Xcode command line tools isn't in any of these locations + lib_dirs = ["lib", "lib64"] + + for subdir in lib_dirs: directories.append(os.path.join(self.config_vars["base"], subdir)) directories = dedupe(directories) @@ -1067,14 +1072,16 @@ print(json.dumps(config)) # The +shared variant isn't reliable, as `spack external find` currently can't # detect it. If +shared, prefer the shared libraries, but check for static if # those aren't found. Vice versa for ~shared. - if "+shared" in self.spec: + if self.spec.satisfies("platform=windows"): + # Since we are searching for link libraries, on Windows search only for + # ".Lib" extensions by default as those represent import libraries for implict links. + candidates = static_libs + elif self.spec.satisfies("+shared"): candidates = shared_libs + static_libs else: candidates = static_libs + shared_libs - candidates = dedupe(candidates) - - for candidate in candidates: + for candidate in dedupe(candidates): lib = self.find_library(candidate) if lib: return lib |