diff --git a/docs/sphinx/index.rst b/docs/sphinx/index.rst index 34a3aa5..9644ada 100644 --- a/docs/sphinx/index.rst +++ b/docs/sphinx/index.rst @@ -211,34 +211,35 @@ is found in the in the following order: Project settings are as follows: - ========================= ========================== ================================================ ======================================= - Setting Command line Option Description Default - ========================= ========================== ================================================ ======================================= - package_name ``--package-name`` Spack package name **None** - package_version **None** Spack package version **None** - package_final_phase ``--package-final-phase`` Controls after which phase Spack should stop **None** - package_source_dir ``--package-source-dir`` Controls the source directory Spack should use **None** - force_commandline_prefix **None** Force user to specify `--prefix` on command line ``false`` - spack_url **None** Download url for Spack ``https://github.com/spack/spack.git`` - spack_commit **None** Spack commit to checkout **None** - spack_activate **None** Spack packages to activate **None** - spack_build_mode ``--spack-build-mode`` Set mode used to build TPLs with Spack ``dev-build`` - spack_configs_path **None** Directory with Spack configs to be autodetected ``spack_configs`` - spack_packages_url **None** Download url for Spack packages ``https://github.com/spack/spack-packages.git`` - spack_packages_path **None** Directory|List with Package Repos to be added ``packages`` - spack_packages_branch **None** Spack packages repo branch to checkout **None** - spack_packages_commit **None** Spack packages repo commit to checkout **None** - spack_packages_tag **None** Spack packages repo tag to checkout. **None** - spack_setup_clingo **None** Do not install clingo if set to ``false`` **None** - spack_externals ``--spack-externals`` Space delimited string of packages for Spack to **None** - search for externals - spack_compiler_paths ``--spack-compiler-paths`` Space delimited string of paths for Spack to **None** - search for compilers - vcpkg_url **None** Download url for Vcpkg ``https://github.com/microsoft/vcpkg`` - vcpkg_branch **None** Vcpkg branch to checkout ``master`` - vcpkg_commit **None** Vcpkg commit to checkout **None** - vcpkg_ports_path ``--vcpkg-ports-path`` Folder with vcpkg ports files **None** - ========================= ========================== ================================================ ======================================= + ========================= =========================== ================================================ ======================================= + Setting Command line Option Description Default + ========================= =========================== ================================================ ======================================= + package_name ``--package-name`` Spack package name **None** + package_version **None** Spack package version **None** + package_final_phase ``--package-final-phase`` Controls after which phase Spack should stop **None** + package_source_dir ``--package-source-dir`` Controls the source directory Spack should use **None** + force_commandline_prefix **None** Force user to specify `--prefix` on command line ``false`` + spack_url **None** Download url for Spack ``https://github.com/spack/spack.git`` + spack_commit **None** Spack commit to checkout **None** + spack_activate **None** Spack packages to activate **None** + spack_build_mode ``--spack-build-mode`` Set mode used to build TPLs with Spack ``dev-build`` + spack_configs_path **None** Directory with Spack configs to be autodetected ``spack_configs`` + spack_packages_url **None** Download url for Spack packages ``https://github.com/spack/spack-packages.git`` + spack_packages_path **None** Directory|List with Package Repos to be added ``packages`` + spack_packages_branch **None** Spack packages repo branch to checkout **None** + spack_packages_commit **None** Spack packages repo commit to checkout **None** + spack_packages_tag **None** Spack packages repo tag to checkout. **None** + spack_setup_clingo **None** Do not install clingo if set to ``false`` **None** + spack_externals ``--spack-externals`` Space delimited string of packages for Spack to **None** + search for externals + spack_compiler_paths ``--spack-compiler-paths`` Space delimited string of paths for Spack to **None** + search for compilers + spack_compiler_mixing ``--spack-compiler-mixing`` Enables compiler mixing (Spack 1.1.0+ only) **None** + vcpkg_url **None** Download url for Vcpkg ``https://github.com/microsoft/vcpkg`` + vcpkg_branch **None** Vcpkg branch to checkout ``master`` + vcpkg_commit **None** Vcpkg commit to checkout **None** + vcpkg_ports_path ``--vcpkg-ports-path`` Folder with vcpkg ports files **None** + ========================= =========================== ================================================ ======================================= If a ``spack_commit`` is present, it supercedes the ``spack_branch`` option, and similarly for ``vcpkg_commit``and ``vcpkg_branch``. The precedence for the Spack packages repo options are ``spack_packages_commit``, ``spack_packages_branch``, and last ``spack_packages_tag``. diff --git a/uberenv.py b/uberenv.py index 8929ecc..07a98c6 100755 --- a/uberenv.py +++ b/uberenv.py @@ -293,6 +293,13 @@ def parse_args(): default=None, help="Path to Spack Environment file (e.g. spack.yaml or spack.lock)") + # Enable compiler mixing argument (Spack 1.1.0+ only) + parser.add_argument("--spack-compiler-mixing", + dest="spack_compiler_mixing", + default=False, + action="store_true", + help="Enables compiler mixing (Spack 1.1.0+ only)") + ############### # parse args ############### @@ -359,6 +366,22 @@ def find_project_config(args): print("ERROR: No Uberenv configuration json file found") sys.exit(-1) +def version2tuple(version: str) -> tuple[int, int, int]: + """ + Converts version string (major.minor.patch.other) to tuple (major, minor, patch). + Add missing 0's if not all three version numbers are supplied (e.g. "1" -> (1, 0, 0)) + + Example usage: + version2tuple(self.spack_version()) >= version2tuple("1.2.0") + + :param version: Version string (major.minor.patch.other) + :type version: str + """ + raw_parts = version.split(".")[:3] + parts = [p if p != "" else "0" for p in raw_parts] + parts += ["0"] * (3 - len(parts)) + return tuple(map(int, parts)) + class UberEnv(): """ Base class for package manager """ @@ -595,6 +618,7 @@ def __init__(self, args, extra_args): self.build_mode = self.set_from_args_or_json("spack_build_mode", True) self.spack_externals = self.set_from_args_or_json("spack_externals", True) self.spack_compiler_paths = self.set_from_args_or_json("spack_compiler_paths", True) + self.spack_compiler_mixing = self.set_from_args_or_json("spack_compiler_mixing", True) # default spack build mode is dev-build if self.build_mode is None: @@ -667,7 +691,7 @@ def spack_exe(self, use_spack_env = True): # Returns version of Spack being used def spack_version(self): res, out = sexe('{0} --version'.format(self.spack_exe(use_spack_env=False)), ret_output=True) - return out + return out.split()[0] def check_concretizer_args(self): cmd = "{0} help install".format(self.spack_exe(use_spack_env=False)) @@ -977,6 +1001,17 @@ def create_spack_env(self): print("[ERROR: Failed to update git reference for builtin package repository]") sys.exit(-1) + if version2tuple(self.spack_version()) >= version2tuple("1.1.0"): + if self.spack_compiler_mixing: + print(f"[enabling mixing compilers in Spack]\n") + res = sexe(f"{self.spack_exe()} config --scope=env:{self.spack_env_directory} add concretizer:compiler_mixing:True") + else: + print(f"[disabling mixing compilers in Spack]\n") + res = sexe(f"{self.spack_exe()} config --scope=env:{self.spack_env_directory} add concretizer:compiler_mixing:False") + if res != 0: + print("[ERROR: Failed to configure compiler mixing in Spack]") + sys.exit(-1) + # Find pre-installed compilers and packages and stop uberenv.py if self.spack_setup_environment: # Finding compilers