Merge branch 'develop' into bugfix/compiler-flag-propagation

This commit is contained in:
Richarda Butler 2023-09-28 14:38:54 -07:00 committed by GitHub
commit 69bbccef6e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
82 changed files with 2454 additions and 372 deletions

105
lib/spack/llnl/path.py Normal file
View File

@ -0,0 +1,105 @@
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
"""Path primitives that just require Python standard library."""
import functools
import sys
from typing import List, Optional
from urllib.parse import urlparse
class Path:
"""Enum to identify the path-style."""
unix: int = 0
windows: int = 1
platform_path: int = windows if sys.platform == "win32" else unix
def format_os_path(path: str, mode: int = Path.unix) -> str:
"""Formats the input path to use consistent, platform specific separators.
Absolute paths are converted between drive letters and a prepended '/' as per platform
requirement.
Parameters:
path: the path to be normalized, must be a string or expose the replace method.
mode: the path file separator style to normalize the passed path to.
Default is unix style, i.e. '/'
"""
if not path:
return path
if mode == Path.windows:
path = path.replace("/", "\\")
else:
path = path.replace("\\", "/")
return path
def convert_to_posix_path(path: str) -> str:
"""Converts the input path to POSIX style."""
return format_os_path(path, mode=Path.unix)
def convert_to_windows_path(path: str) -> str:
"""Converts the input path to Windows style."""
return format_os_path(path, mode=Path.windows)
def convert_to_platform_path(path: str) -> str:
"""Converts the input path to the current platform's native style."""
return format_os_path(path, mode=Path.platform_path)
def path_to_os_path(*parameters: str) -> List[str]:
"""Takes an arbitrary number of positional parameters, converts each argument of type
string to use a normalized filepath separator, and returns a list of all values.
"""
def _is_url(path_or_url: str) -> bool:
if "\\" in path_or_url:
return False
url_tuple = urlparse(path_or_url)
return bool(url_tuple.scheme) and len(url_tuple.scheme) > 1
result = []
for item in parameters:
if isinstance(item, str) and not _is_url(item):
item = convert_to_platform_path(item)
result.append(item)
return result
def system_path_filter(_func=None, arg_slice: Optional[slice] = None):
"""Filters function arguments to account for platform path separators.
Optional slicing range can be specified to select specific arguments
This decorator takes all (or a slice) of a method's positional arguments
and normalizes usage of filepath separators on a per platform basis.
Note: `**kwargs`, urls, and any type that is not a string are ignored
so in such cases where path normalization is required, that should be
handled by calling path_to_os_path directly as needed.
Parameters:
arg_slice: a slice object specifying the slice of arguments
in the decorated method over which filepath separators are
normalized
"""
def holder_func(func):
@functools.wraps(func)
def path_filter_caller(*args, **kwargs):
args = list(args)
if arg_slice:
args[arg_slice] = path_to_os_path(*args[arg_slice])
else:
args = path_to_os_path(*args)
return func(*args, **kwargs)
return path_filter_caller
if _func:
return holder_func(_func)
return holder_func

67
lib/spack/llnl/string.py Normal file
View File

@ -0,0 +1,67 @@
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
"""String manipulation functions that do not have other dependencies than Python
standard library
"""
from typing import List, Optional
def comma_list(sequence: List[str], article: str = "") -> str:
if type(sequence) is not list:
sequence = list(sequence)
if not sequence:
return ""
if len(sequence) == 1:
return sequence[0]
out = ", ".join(str(s) for s in sequence[:-1])
if len(sequence) != 2:
out += "," # oxford comma
out += " "
if article:
out += article + " "
out += str(sequence[-1])
return out
def comma_or(sequence: List[str]) -> str:
"""Return a string with all the elements of the input joined by comma, but the last
one (which is joined by 'or').
"""
return comma_list(sequence, "or")
def comma_and(sequence: List[str]) -> str:
"""Return a string with all the elements of the input joined by comma, but the last
one (which is joined by 'and').
"""
return comma_list(sequence, "and")
def quote(sequence: List[str], q: str = "'") -> List[str]:
"""Quotes each item in the input list with the quote character passed as second argument."""
return [f"{q}{e}{q}" for e in sequence]
def plural(n: int, singular: str, plural: Optional[str] = None, show_n: bool = True) -> str:
"""Pluralize <singular> word by adding an s if n != 1.
Arguments:
n: number of things there are
singular: singular form of word
plural: optional plural form, for when it's not just singular + 's'
show_n: whether to include n in the result string (default True)
Returns:
"1 thing" if n == 1 or "n things" if n != 1
"""
number = f"{n} " if show_n else ""
if n == 1:
return f"{number}{singular}"
elif plural is not None:
return f"{number}{plural}"
else:
return f"{number}{singular}s"

View File

@ -28,7 +28,8 @@
from llnl.util.symlink import islink, readlink, resolve_link_target_relative_to_the_link, symlink
from spack.util.executable import Executable, which
from spack.util.path import path_to_os_path, system_path_filter
from ..path import path_to_os_path, system_path_filter
if sys.platform != "win32":
import grp
@ -336,8 +337,7 @@ def groupid_to_group(x):
if string:
regex = re.escape(regex)
filenames = path_to_os_path(*filenames)
for filename in filenames:
for filename in path_to_os_path(*filenames):
msg = 'FILTER FILE: {0} [replacing "{1}"]'
tty.debug(msg.format(filename, regex))

View File

@ -14,7 +14,7 @@
from llnl.util import lang, tty
import spack.util.string
from ..string import plural
if sys.platform != "win32":
import fcntl
@ -169,7 +169,7 @@ def _attempts_str(wait_time, nattempts):
if nattempts <= 1:
return ""
attempts = spack.util.string.plural(nattempts, "attempt")
attempts = plural(nattempts, "attempt")
return " after {} and {}".format(lang.pretty_seconds(wait_time), attempts)

View File

@ -11,8 +11,7 @@
from llnl.util import lang, tty
from spack.error import SpackError
from spack.util.path import system_path_filter
from ..path import system_path_filter
if sys.platform == "win32":
from win32file import CreateHardLink
@ -338,7 +337,7 @@ def resolve_link_target_relative_to_the_link(link):
return os.path.join(link_dir, target)
class SymlinkError(SpackError):
class SymlinkError(RuntimeError):
"""Exception class for errors raised while creating symlinks,
junctions and hard links
"""

View File

@ -647,8 +647,7 @@ class BuildManifestVisitor(BaseDirectoryVisitor):
directories."""
def __init__(self):
# Save unique identifiers of files to avoid
# relocating hardlink files for each path.
# Save unique identifiers of hardlinks to avoid relocating them multiple times
self.visited = set()
# Lists of files we will check
@ -657,6 +656,8 @@ def __init__(self):
def seen_before(self, root, rel_path):
stat_result = os.lstat(os.path.join(root, rel_path))
if stat_result.st_nlink == 1:
return False
identifier = (stat_result.st_dev, stat_result.st_ino)
if identifier in self.visited:
return True
@ -1581,9 +1582,10 @@ def dedupe_hardlinks_if_necessary(root, buildinfo):
for rel_path in buildinfo[key]:
stat_result = os.lstat(os.path.join(root, rel_path))
identifier = (stat_result.st_dev, stat_result.st_ino)
if identifier in visited:
continue
visited.add(identifier)
if stat_result.st_nlink > 1:
if identifier in visited:
continue
visited.add(identifier)
new_list.append(rel_path)
buildinfo[key] = new_list

View File

@ -43,6 +43,7 @@
from typing import List, Tuple
import llnl.util.tty as tty
from llnl.string import plural
from llnl.util.filesystem import join_path
from llnl.util.lang import dedupe
from llnl.util.symlink import symlink
@ -82,7 +83,6 @@
from spack.util.executable import Executable
from spack.util.log_parse import make_log_context, parse_log_events
from spack.util.module_cmd import load_module, module, path_from_modules
from spack.util.string import plural
#
# This can be set by the user to globally disable parallel builds.

View File

@ -61,6 +61,11 @@ def component_prefix(self):
"""Path to component <prefix>/<component>/<version>."""
return self.prefix.join(join_path(self.component_dir, self.spec.version))
@property
def env_script_args(self):
"""Additional arguments to pass to vars.sh script."""
return ()
def install(self, spec, prefix):
self.install_component(basename(self.url_for_version(spec.version)))
@ -124,7 +129,7 @@ def setup_run_environment(self, env):
if "~envmods" not in self.spec:
env.extend(
EnvironmentModifications.from_sourcing_file(
join_path(self.component_prefix, "env", "vars.sh")
join_path(self.component_prefix, "env", "vars.sh"), *self.env_script_args
)
)

View File

@ -11,6 +11,7 @@
from textwrap import dedent
from typing import List, Match, Tuple
import llnl.string
import llnl.util.tty as tty
from llnl.util.filesystem import join_path
from llnl.util.lang import attr_setdefault, index_by
@ -29,7 +30,6 @@
import spack.user_environment as uenv
import spack.util.spack_json as sjson
import spack.util.spack_yaml as syaml
import spack.util.string
# cmd has a submodule called "list" so preserve the python list module
python_list = list
@ -516,7 +516,7 @@ def print_how_many_pkgs(specs, pkg_type=""):
category, e.g. if pkg_type is "installed" then the message
would be "3 installed packages"
"""
tty.msg("%s" % spack.util.string.plural(len(specs), pkg_type + " package"))
tty.msg("%s" % llnl.string.plural(len(specs), pkg_type + " package"))
def spack_is_git_repo():

View File

@ -13,6 +13,7 @@
import llnl.util.tty as tty
import llnl.util.tty.color as clr
from llnl.string import plural
from llnl.util.lang import elide_list
import spack.binary_distribution as bindist
@ -32,7 +33,6 @@
from spack.cmd import display_specs
from spack.spec import Spec, save_dependency_specfiles
from spack.stage import Stage
from spack.util.string import plural
description = "create, download and install binary packages"
section = "packaging"

View File

@ -9,6 +9,7 @@
import sys
import tempfile
import llnl.string as string
import llnl.util.filesystem as fs
import llnl.util.tty as tty
from llnl.util.tty.colify import colify
@ -28,7 +29,6 @@
import spack.schema.env
import spack.spec
import spack.tengine
import spack.util.string as string
from spack.util.environment import EnvironmentModifications
description = "manage virtual environments"

View File

@ -6,10 +6,11 @@
import posixpath
import sys
from llnl.path import convert_to_posix_path
import spack.paths
import spack.util.executable
from spack.spec import Spec
from spack.util.path import convert_to_posix_path
description = "generate Windows installer"
section = "admin"

View File

@ -5,6 +5,7 @@
import io
import sys
import llnl.string
import llnl.util.tty as tty
import llnl.util.tty.colify as colify
@ -24,7 +25,7 @@ def report_tags(category, tags):
if isatty:
num = len(tags)
fmt = "{0} package tag".format(category)
buffer.write("{0}:\n".format(spack.util.string.plural(num, fmt)))
buffer.write("{0}:\n".format(llnl.string.plural(num, fmt)))
if tags:
colify.colify(tags, output=buffer, tty=isatty, indent=4)

View File

@ -13,6 +13,7 @@
import tempfile
from typing import List, Optional, Sequence
import llnl.path
import llnl.util.lang
import llnl.util.tty as tty
from llnl.util.filesystem import path_contains_subdirectory, paths_containing_libs
@ -24,7 +25,6 @@
import spack.util.module_cmd
import spack.version
from spack.util.environment import filter_system_paths
from spack.util.path import system_path_filter
__all__ = ["Compiler"]
@ -160,7 +160,7 @@ def _parse_link_paths(string):
return implicit_link_dirs
@system_path_filter
@llnl.path.system_path_filter
def _parse_non_system_link_dirs(string: str) -> List[str]:
"""Parses link paths out of compiler debug output.

View File

@ -120,10 +120,8 @@ def write_host_environment(self, spec):
versioning. We use it in the case that an analysis later needs to
easily access this information.
"""
from spack.util.environment import get_host_environment_metadata
env_file = self.env_metadata_path(spec)
environ = get_host_environment_metadata()
environ = spack.spec.get_host_environment_metadata()
with open(env_file, "w") as fd:
sjson.dump(environ, fd)

View File

@ -404,7 +404,7 @@ def _write_yaml(data, str_or_file):
def _eval_conditional(string):
"""Evaluate conditional definitions using restricted variable scope."""
valid_variables = spack.util.environment.get_host_environment()
valid_variables = spack.spec.get_host_environment()
valid_variables.update({"re": re, "env": os.environ})
return eval(string, valid_variables)

View File

@ -35,6 +35,7 @@
import llnl.util
import llnl.util.filesystem as fs
import llnl.util.tty as tty
from llnl.string import comma_and, quote
from llnl.util.filesystem import get_single_file, mkdirp, temp_cwd, temp_rename, working_dir
from llnl.util.symlink import symlink
@ -49,7 +50,6 @@
import spack.version.git_ref_lookup
from spack.util.compression import decompressor_for
from spack.util.executable import CommandNotFoundError, which
from spack.util.string import comma_and, quote
#: List of all fetch strategies, created by FetchStrategy metaclass.
all_strategies = []

View File

@ -79,8 +79,7 @@ class ElfFilesWithRPathVisitor(BaseDirectoryVisitor):
"""Visitor that collects all elf files that have an rpath"""
def __init__(self):
# Map from (ino, dev) -> path. We need 1 path per file, if there are hardlinks,
# we don't need to store the path multiple times.
# Keep track of what hardlinked files we've already visited.
self.visited = set()
def visit_file(self, root, rel_path, depth):
@ -89,10 +88,10 @@ def visit_file(self, root, rel_path, depth):
identifier = (s.st_ino, s.st_dev)
# We're hitting a hardlink or symlink of an excluded lib, no need to parse.
if identifier in self.visited:
return
self.visited.add(identifier)
if s.st_nlink > 1:
if identifier in self.visited:
return
self.visited.add(identifier)
result = drop_redundant_rpaths(filepath)

View File

@ -17,6 +17,7 @@
import llnl.util.filesystem as fs
import llnl.util.tty as tty
from llnl.string import plural
from llnl.util.lang import nullcontext
from llnl.util.tty.color import colorize
@ -26,7 +27,6 @@
from spack.installer import InstallError
from spack.spec import Spec
from spack.util.prefix import Prefix
from spack.util.string import plural
#: Stand-alone test failure info type
TestFailureType = Tuple[BaseException, str]

View File

@ -774,7 +774,7 @@ def _profile_wrapper(command, parser, args, unknown_args):
pr.disable()
# print out profile stats.
stats = pstats.Stats(pr)
stats = pstats.Stats(pr, stream=sys.stderr)
stats.sort_stats(*sortby)
stats.print_stats(nlines)

View File

@ -26,6 +26,7 @@
import uuid
from typing import Any, Dict, List, Union
import llnl.path
import llnl.util.filesystem as fs
import llnl.util.lang
import llnl.util.tty as tty
@ -563,7 +564,7 @@ def __init__(
self.checker = package_checker
self.packages_path = self.checker.packages_path
if sys.platform == "win32":
self.packages_path = spack.util.path.convert_to_posix_path(self.packages_path)
self.packages_path = llnl.path.convert_to_posix_path(self.packages_path)
self.namespace = namespace
self.indexers: Dict[str, Indexer] = {}

View File

@ -54,10 +54,14 @@
import io
import itertools
import os
import platform
import re
import socket
import warnings
from typing import Callable, List, Optional, Tuple, Union
from typing import Any, Callable, Dict, List, Optional, Tuple, Union
import llnl.path
import llnl.string
import llnl.util.filesystem as fs
import llnl.util.lang as lang
import llnl.util.tty as tty
@ -82,11 +86,9 @@
import spack.util.executable
import spack.util.hash
import spack.util.module_cmd as md
import spack.util.path as pth
import spack.util.prefix
import spack.util.spack_json as sjson
import spack.util.spack_yaml as syaml
import spack.util.string
import spack.variant as vt
import spack.version as vn
import spack.version.git_ref_lookup
@ -1390,7 +1392,7 @@ def _format_module_list(modules):
@property
def external_path(self):
return pth.path_to_os_path(self._external_path)[0]
return llnl.path.path_to_os_path(self._external_path)[0]
@external_path.setter
def external_path(self, ext_path):
@ -1799,7 +1801,7 @@ def prefix(self):
@prefix.setter
def prefix(self, value):
self._prefix = spack.util.prefix.Prefix(pth.convert_to_platform_path(value))
self._prefix = spack.util.prefix.Prefix(llnl.path.convert_to_platform_path(value))
def spec_hash(self, hash):
"""Utility method for computing different types of Spec hashes.
@ -5148,6 +5150,43 @@ def save_dependency_specfiles(root: Spec, output_directory: str, dependencies: L
fd.write(spec.to_json(hash=ht.dag_hash))
def get_host_environment_metadata() -> Dict[str, str]:
"""Get the host environment, reduce to a subset that we can store in
the install directory, and add the spack version.
"""
import spack.main
environ = get_host_environment()
return {
"host_os": environ["os"],
"platform": environ["platform"],
"host_target": environ["target"],
"hostname": environ["hostname"],
"spack_version": spack.main.get_version(),
"kernel_version": platform.version(),
}
def get_host_environment() -> Dict[str, Any]:
"""Return a dictionary (lookup) with host information (not including the
os.environ).
"""
host_platform = spack.platforms.host()
host_target = host_platform.target("default_target")
host_os = host_platform.operating_system("default_os")
arch_fmt = "platform={0} os={1} target={2}"
arch_spec = Spec(arch_fmt.format(host_platform, host_os, host_target))
return {
"target": str(host_target),
"os": str(host_os),
"platform": str(host_platform),
"arch": arch_spec,
"architecture": arch_spec,
"arch_str": str(arch_spec),
"hostname": socket.gethostname(),
}
class SpecParseError(spack.error.SpecError):
"""Wrapper for ParseError for when we're parsing specs."""
@ -5208,7 +5247,7 @@ class InvalidDependencyError(spack.error.SpecError):
def __init__(self, pkg, deps):
self.invalid_deps = deps
super().__init__(
"Package {0} does not depend on {1}".format(pkg, spack.util.string.comma_or(deps))
"Package {0} does not depend on {1}".format(pkg, llnl.string.comma_or(deps))
)

View File

@ -14,6 +14,7 @@
import tempfile
from typing import Callable, Dict, Iterable, Optional
import llnl.string
import llnl.util.lang
import llnl.util.tty as tty
from llnl.util.filesystem import (
@ -37,7 +38,6 @@
import spack.util.lock
import spack.util.path as sup
import spack.util.pattern as pattern
import spack.util.string
import spack.util.url as url_util
from spack.util.crypto import bit_length, prefix_bits
@ -897,7 +897,7 @@ def get_checksums_for_versions(
num_ver = len(sorted_versions)
tty.msg(
f"Found {spack.util.string.plural(num_ver, 'version')} of {package_name}:",
f"Found {llnl.string.plural(num_ver, 'version')} of {package_name}:",
"",
*llnl.util.lang.elide_list(
["{0:{1}} {2}".format(str(v), max_len, url_by_version[v]) for v in sorted_versions]

View File

@ -9,6 +9,7 @@
import pytest
from llnl.path import Path, convert_to_platform_path
from llnl.util.filesystem import HeaderList, LibraryList
import spack.build_environment
@ -21,7 +22,6 @@
from spack.util.cpus import determine_number_of_jobs
from spack.util.environment import EnvironmentModifications
from spack.util.executable import Executable
from spack.util.path import Path, convert_to_platform_path
def os_pathsep_join(path, *pths):

View File

@ -7,13 +7,14 @@
import pytest
from llnl.path import convert_to_posix_path
import spack.bootstrap
import spack.bootstrap.core
import spack.config
import spack.environment as ev
import spack.main
import spack.mirror
from spack.util.path import convert_to_posix_path
_bootstrap = spack.main.SpackCommand("bootstrap")

View File

@ -12,11 +12,12 @@
import pytest
from llnl.path import path_to_os_path
import spack.paths
import spack.repo
from spack.directory_layout import DirectoryLayout, InvalidDirectoryLayoutParametersError
from spack.spec import Spec
from spack.util.path import path_to_os_path
# number of packages to test (to reduce test time)
max_packages = 10

View File

@ -0,0 +1,43 @@
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import pytest
import llnl.string
@pytest.mark.parametrize(
"arguments,expected",
[
((0, "thing"), "0 things"),
((1, "thing"), "1 thing"),
((2, "thing"), "2 things"),
((1, "thing", "wombats"), "1 thing"),
((2, "thing", "wombats"), "2 wombats"),
((2, "thing", "wombats", False), "wombats"),
],
)
def test_plural(arguments, expected):
assert llnl.string.plural(*arguments) == expected
@pytest.mark.parametrize(
"arguments,expected",
[((["one", "two"],), ["'one'", "'two'"]), ((["one", "two"], "^"), ["^one^", "^two^"])],
)
def test_quote(arguments, expected):
assert llnl.string.quote(*arguments) == expected
@pytest.mark.parametrize(
"input,expected_and,expected_or",
[
(["foo"], "foo", "foo"),
(["foo", "bar"], "foo and bar", "foo or bar"),
(["foo", "bar", "baz"], "foo, bar, and baz", "foo, bar, or baz"),
],
)
def test_comma_and_or(input, expected_and, expected_or):
assert llnl.string.comma_and(input) == expected_and
assert llnl.string.comma_or(input) == expected_or

View File

@ -1,14 +0,0 @@
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack.util.string import plural
def test_plural():
assert plural(0, "thing") == "0 things"
assert plural(1, "thing") == "1 thing"
assert plural(2, "thing") == "2 things"
assert plural(1, "thing", "wombats") == "1 thing"
assert plural(2, "thing", "wombats") == "2 wombats"

View File

@ -31,12 +31,12 @@
import re
import llnl.url
from llnl.path import convert_to_posix_path
from llnl.util.tty.color import cescape, colorize
import spack.error
import spack.util.web
import spack.version
from spack.util.path import convert_to_posix_path
#
# Note: We call the input to most of these functions a "path" but the functions

View File

@ -10,21 +10,16 @@
import os
import os.path
import pickle
import platform
import re
import socket
import sys
from functools import wraps
from typing import Any, Callable, Dict, List, MutableMapping, Optional, Tuple, Union
from llnl.path import path_to_os_path, system_path_filter
from llnl.util import tty
from llnl.util.lang import dedupe
import spack.platforms
import spack.spec
from .executable import Executable, which
from .path import path_to_os_path, system_path_filter
if sys.platform == "win32":
SYSTEM_PATHS = [
@ -224,43 +219,6 @@ def pickle_environment(path: Path, environment: Optional[Dict[str, str]] = None)
pickle.dump(dict(environment if environment else os.environ), pickle_file, protocol=2)
def get_host_environment_metadata() -> Dict[str, str]:
"""Get the host environment, reduce to a subset that we can store in
the install directory, and add the spack version.
"""
import spack.main
environ = get_host_environment()
return {
"host_os": environ["os"],
"platform": environ["platform"],
"host_target": environ["target"],
"hostname": environ["hostname"],
"spack_version": spack.main.get_version(),
"kernel_version": platform.version(),
}
def get_host_environment() -> Dict[str, Any]:
"""Return a dictionary (lookup) with host information (not including the
os.environ).
"""
host_platform = spack.platforms.host()
host_target = host_platform.target("default_target")
host_os = host_platform.operating_system("default_os")
arch_fmt = "platform={0} os={1} target={2}"
arch_spec = spack.spec.Spec(arch_fmt.format(host_platform, host_os, host_target))
return {
"target": str(host_target),
"os": str(host_os),
"platform": str(host_platform),
"arch": arch_spec,
"architecture": arch_spec,
"arch_str": str(arch_spec),
"hostname": socket.gethostname(),
}
@contextlib.contextmanager
def set_env(**kwargs):
"""Temporarily sets and restores environment variables.

View File

@ -15,7 +15,6 @@
import sys
import tempfile
from datetime import date
from urllib.parse import urlparse
import llnl.util.tty as tty
from llnl.util.lang import memoized
@ -98,31 +97,10 @@ def replacements():
SPACK_PATH_PADDING_CHARS = "__spack_path_placeholder__"
def is_path_url(path):
if "\\" in path:
return False
url_tuple = urlparse(path)
return bool(url_tuple.scheme) and len(url_tuple.scheme) > 1
def win_exe_ext():
return ".exe"
def path_to_os_path(*pths):
"""
Takes an arbitrary number of positional parameters
converts each arguemnt of type string to use a normalized
filepath separator, and returns a list of all values
"""
ret_pths = []
for pth in pths:
if isinstance(pth, str) and not is_path_url(pth):
pth = convert_to_platform_path(pth)
ret_pths.append(pth)
return ret_pths
def sanitize_filename(filename: str) -> str:
"""
Replaces unsupported characters (for the host) in a filename with underscores.
@ -145,42 +123,6 @@ def sanitize_filename(filename: str) -> str:
return re.sub(r'[\x00-\x1F\x7F"*/:<>?\\|]', "_", filename)
def system_path_filter(_func=None, arg_slice=None):
"""
Filters function arguments to account for platform path separators.
Optional slicing range can be specified to select specific arguments
This decorator takes all (or a slice) of a method's positional arguments
and normalizes usage of filepath separators on a per platform basis.
Note: **kwargs, urls, and any type that is not a string are ignored
so in such cases where path normalization is required, that should be
handled by calling path_to_os_path directly as needed.
Parameters:
arg_slice (slice): a slice object specifying the slice of arguments
in the decorated method over which filepath separators are
normalized
"""
from functools import wraps
def holder_func(func):
@wraps(func)
def path_filter_caller(*args, **kwargs):
args = list(args)
if arg_slice:
args[arg_slice] = path_to_os_path(*args[arg_slice])
else:
args = path_to_os_path(*args)
return func(*args, **kwargs)
return path_filter_caller
if _func:
return holder_func(_func)
return holder_func
@memoized
def get_system_path_max():
# Choose a conservative default
@ -202,54 +144,6 @@ def get_system_path_max():
return sys_max_path_length
class Path:
"""
Describes the filepath separator types
in an enum style
with a helper attribute
exposing the path type of
the current platform.
"""
unix = 0
windows = 1
platform_path = windows if sys.platform == "win32" else unix
def format_os_path(path, mode=Path.unix):
"""
Format path to use consistent, platform specific
separators. Absolute paths are converted between
drive letters and a prepended '/' as per platform
requirement.
Parameters:
path (str): the path to be normalized, must be a string
or expose the replace method.
mode (Path): the path filesperator style to normalize the
passed path to. Default is unix style, i.e. '/'
"""
if not path:
return path
if mode == Path.windows:
path = path.replace("/", "\\")
else:
path = path.replace("\\", "/")
return path
def convert_to_posix_path(path):
return format_os_path(path, mode=Path.unix)
def convert_to_windows_path(path):
return format_os_path(path, mode=Path.windows)
def convert_to_platform_path(path):
return format_os_path(path, mode=Path.platform_path)
def substitute_config_variables(path):
"""Substitute placeholders into paths.

View File

@ -1,57 +0,0 @@
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
def comma_list(sequence, article=""):
if type(sequence) is not list:
sequence = list(sequence)
if not sequence:
return
elif len(sequence) == 1:
return sequence[0]
else:
out = ", ".join(str(s) for s in sequence[:-1])
if len(sequence) != 2:
out += "," # oxford comma
out += " "
if article:
out += article + " "
out += str(sequence[-1])
return out
def comma_or(sequence):
return comma_list(sequence, "or")
def comma_and(sequence):
return comma_list(sequence, "and")
def quote(sequence, q="'"):
return ["%s%s%s" % (q, e, q) for e in sequence]
def plural(n, singular, plural=None, show_n=True):
"""Pluralize <singular> word by adding an s if n != 1.
Arguments:
n (int): number of things there are
singular (str): singular form of word
plural (str or None): optional plural form, for when it's not just
singular + 's'
show_n (bool): whether to include n in the result string (default True)
Returns:
(str): "1 thing" if n == 1 or "n things" if n != 1
"""
number = "%s " % n if show_n else ""
if n == 1:
return "%s%s" % (number, singular)
elif plural is not None:
return "%s%s" % (number, plural)
else:
return "%s%ss" % (number, singular)

View File

@ -14,7 +14,9 @@
import urllib.parse
import urllib.request
from spack.util.path import convert_to_posix_path, sanitize_filename
from llnl.path import convert_to_posix_path
from spack.util.path import sanitize_filename
def validate_scheme(scheme):

View File

@ -15,10 +15,10 @@
import llnl.util.lang as lang
import llnl.util.tty.color
from llnl.string import comma_or
import spack.directives
import spack.error as error
from spack.util.string import comma_or
special_variant_values = [None, "none", "*"]

View File

@ -827,16 +827,16 @@ e4s-cray-rhel-build:
variables:
SPACK_CI_STACK_NAME: e4s-cray-sles
e4s-cray-sles-generate:
extends: [ ".generate-cray-sles", ".e4s-cray-sles" ]
# e4s-cray-sles-generate:
# extends: [ ".generate-cray-sles", ".e4s-cray-sles" ]
e4s-cray-sles-build:
extends: [ ".build", ".e4s-cray-sles" ]
trigger:
include:
- artifact: jobs_scratch_dir/cloud-ci-pipeline.yml
job: e4s-cray-sles-generate
strategy: depend
needs:
- artifacts: True
job: e4s-cray-sles-generate
# e4s-cray-sles-build:
# extends: [ ".build", ".e4s-cray-sles" ]
# trigger:
# include:
# - artifact: jobs_scratch_dir/cloud-ci-pipeline.yml
# job: e4s-cray-sles-generate
# strategy: depend
# needs:
# - artifacts: True
# job: e4s-cray-sles-generate

View File

@ -18,6 +18,7 @@ class Apex(CMakePackage):
version("develop", branch="develop")
version("master", branch="master")
version("2.6.3", sha256="7fef12937d3bd1271a01abe44cb931b1d63823fb5c74287a332f3012ed7297d5")
version("2.6.2", sha256="0c3ec26631db7925f50cf4e8920a778b57d11913f239a0eb964081f925129725")
version("2.6.1", sha256="511dbab0af541489052a3d6379c48f9577e51654491d3b2c8545020e9d29fb29")
version("2.6.0", sha256="25b4f6afd1083475dc6680b5da87759c62d31fcf368996185573694fc40d5317")
@ -115,6 +116,9 @@ class Apex(CMakePackage):
conflicts("+jemalloc", when="+gperftools")
conflicts("+plugins", when="~activeharmony")
# https://github.com/UO-OACISS/apex/pull/177#issuecomment-1726322959
conflicts("+openmp", when="%gcc")
# Patches
# This patch ensures that the missing dependency_tree.hpp header is

View File

@ -0,0 +1,11 @@
--- a/src/cmake/cxxConfigure.cmake 2017-06-22 12:14:50.000000000 -0500
+++ b/src/cmake/cxxConfigure.cmake 2023-09-25 11:50:55.819690648 -0500
@@ -118,7 +118,7 @@
set(BCL2FASTQ_DEP_LIB ${BCL2FASTQ_DEP_LIB} "${LIBEXSLT_LIBRARIES}" "${LIBXSLT_LIBRARIES}" "${LIBXML2_LIBRARIES}")
#set (CMAKE_CXX_FLAGS "$ENV{CXX_FLAGS} $ENV{CXXFLAGS} -fopenmp -msse2 -Werror -Wall -Wextra -Wunused -Wno-long-long -Wsign-compare -Wpointer-arith" CACHE STRING "g++ flags" FORCE)
-set (CMAKE_CXX_FLAGS "$ENV{CXX_FLAGS} $ENV{CXXFLAGS} -std=c++11 -fopenmp -msse2 -Wall -Wextra -Wunused -Wno-long-long -Wsign-compare -Wpointer-arith" CACHE STRING "g++ flags" FORCE)
+set (CMAKE_CXX_FLAGS "$ENV{CXX_FLAGS} $ENV{CXXFLAGS} -std=c++11 -fopenmp -Wall -Wextra -Wunused -Wno-long-long -Wsign-compare -Wpointer-arith" CACHE STRING "g++ flags" FORCE)
#set (CMAKE_CXX_FLAGS_DEBUG "-O0 -g -pg -fprofile-arcs -ftest-coverage -D_GLIBCXX_DEBUG" CACHE STRING "g++ flags" FORCE)
set (CMAKE_CXX_FLAGS_DEBUG "-O0 -std=c++11 -g -pg -fprofile-arcs -ftest-coverage" CACHE STRING "g++ flags" FORCE)
#set (CMAKE_CXX_FLAGS_DEBUG "-std=c++11 -O0 -g -pg -fprofile-arcs -ftest-coverage" CACHE STRING "g++ flags" FORCE)

View File

@ -49,6 +49,8 @@ class Bcl2fastq2(Package):
# After finding the libxslt bits, cmake still needs to wire in the
# libexslt bits.
patch("cxxConfigure-cmake.patch")
# -msse2 isn't valid for arm
patch("cxxConfigure-aarch64.patch", when="target=aarch64:")
root_cmakelists_dir = "src"

View File

@ -498,7 +498,9 @@ def determine_bootstrap_options(self, spec, with_libs, options):
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:
f.write("using {0} : : {1} ;\n".format(boost_toolset_id, spack_cxx))
if not spec.satisfies("platform=windows"):
# Skip this on Windows since we don't have a cl.exe wrapper in spack
f.write("using {0} : : {1} ;\n".format(boost_toolset_id, spack_cxx))
if "+mpi" in spec:
# Use the correct mpi compiler. If the compiler options are
@ -584,7 +586,7 @@ def determine_b2_options(self, spec, options):
options.extend(["link=%s" % ",".join(link_types), "--layout=%s" % layout])
if not spec.satisfies("@:1.75 %intel"):
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
# as that was considered to be redundant/conflicting with
@ -634,7 +636,7 @@ def determine_b2_options(self, spec, options):
return threading_opts
def add_buildopt_symlinks(self, prefix):
with working_dir(prefix.lib):
with working_dir(prefix.lib, create=True):
for lib in os.listdir(os.curdir):
if os.path.isfile(lib):
prefix, remainder = lib.split(".", 1)
@ -687,12 +689,15 @@ def install(self, spec, prefix):
# to make Boost find the user-config.jam
env["BOOST_BUILD_PATH"] = self.stage.source_path
bootstrap = Executable("./bootstrap.sh")
bootstrap_options = ["--prefix=%s" % prefix]
self.determine_bootstrap_options(spec, with_libs, bootstrap_options)
bootstrap(*bootstrap_options)
if self.spec.satisfies("platform=windows"):
bootstrap = Executable("cmd.exe")
bootstrap("/c", ".\\bootstrap.bat", *bootstrap_options)
else:
bootstrap = Executable("./bootstrap.sh")
bootstrap(*bootstrap_options)
# strip the toolchain to avoid double include errors (intel) or
# user-config being overwritten (again intel, but different boost version)
@ -704,6 +709,8 @@ def install(self, spec, prefix):
# b2 used to be called bjam, before 1.47 (sigh)
b2name = "./b2" if spec.satisfies("@1.47:") else "./bjam"
if self.spec.satisfies("platform=windows"):
b2name = "b2.exe" if spec.satisfies("@1.47:") else "bjam.exe"
b2 = Executable(b2name)
jobs = make_jobs
@ -711,11 +718,14 @@ def install(self, spec, prefix):
if jobs > 64 and spec.satisfies("@:1.58"):
jobs = 64
b2_options = [
"-j",
"%s" % jobs,
"--user-config=%s" % os.path.join(self.stage.source_path, "user-config.jam"),
]
# 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)
threading_opts = self.determine_b2_options(spec, b2_options)
@ -727,8 +737,11 @@ def install(self, spec, prefix):
# In theory it could be done on one call but it fails on
# Boost.MPI if the threading options are not separated.
for threading_opt in threading_opts:
b2("install", "threading=%s" % threading_opt, *b2_options)
if not self.spec.satisfies("platform=windows"):
for threading_opt in threading_opts:
b2("install", "threading=%s" % threading_opt, *b2_options)
else:
b2("install", *b2_options)
if "+multithreaded" in spec and "~taggedlayout" in spec:
self.add_buildopt_symlinks(prefix)

View File

@ -27,6 +27,7 @@ class Cmake(Package):
executables = ["^cmake[0-9]*$"]
version("master", branch="master")
version("3.27.6", sha256="ef3056df528569e0e8956f6cf38806879347ac6de6a4ff7e4105dc4578732cfb")
version("3.27.4", sha256="0a905ca8635ca81aa152e123bdde7e54cbe764fdd9a70d62af44cad8b92967af")
version("3.27.3", sha256="66afdc0f181461b70b6fedcde9ecc4226c5cd184e7203617c83b7d8e47f49521")
version("3.27.2", sha256="798e50085d423816fe96c9ef8bee5e50002c9eca09fed13e300de8a91d35c211")

View File

@ -17,6 +17,7 @@ class CrosstoolNg(AutotoolsPackage):
maintainers("alalazo")
version("1.26.0", sha256="e8ce69c5c8ca8d904e6923ccf86c53576761b9cf219e2e69235b139c8e1b74fc")
version("1.25.0", sha256="68162f342243cd4189ed7c1f4e3bb1302caa3f2cbbf8331879bd01fe06c60cd3")
depends_on("ncurses")

View File

@ -0,0 +1,71 @@
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os
from spack.package import *
class Elbencho(MakefilePackage):
"""
Elbencho storage benchmark
"""
homepage = "https://github.com/breuner/elbencho"
url = "https://github.com/breuner/elbencho/archive/refs/tags/v3.0-1.tar.gz"
maintainers("ethanjjjjjjj")
version("3.0-1", sha256="19dad85e1fc74419dcdf740f11a47d3f6d566770a06e40976755a3404566c11d")
version("2.2-5", sha256="4b598639452665a8b79c4c9d8a22ae63fb9b04057635a45e686aa3939ee255b4")
version("2.2-3", sha256="0ae2d495d2863b84f21f55b7c526674fab1be723d0697087017946647f79d0e6")
version("2.1-5", sha256="5d2293dcdb766e9194bed964486a10b4c8c308cc1ba8c0044c6e5a2aadd4f199")
version("2.1-3", sha256="9d08aa0e83753666cb16a78320dfa5710350879f9f4f1e281dacd69f53249d01")
version("2.1-1", sha256="18be49f521df2fab4f16a1a9f00dd6104a25e5ea335ce8801bf07268ed9271a9")
version("2.0-9", sha256="fe0f67fbb7dd7c743f8b3e0a92358f7393f2950da456474d4adb38690fab1878")
version("2.0-7", sha256="a2e49cb2cf1ae99e46e9fa95b42ece250cb58fbadb4c393f9776b40204e8b2c0")
variant("s3", default=False, description="Enable support for s3 api")
variant("cuda", default=True, description="Enable CUDA support", when="+cufile")
variant("cuda", default=False, description="Enable CUDA support")
variant("cufile", default=False, description="GPU Direct Storage")
depends_on("cuda", when="+cuda")
depends_on(
"""
boost
+filesystem+program_options
+thread
+system+date_time
+regex
+serialization
+iostreams
"""
)
depends_on("ncurses")
depends_on("numactl")
depends_on("libaio")
depends_on("curl", when="+s3")
depends_on("libarchive", when="+s3")
depends_on("openssl", when="+s3")
depends_on("libuuid", when="+s3")
depends_on("zlib", when="+s3")
depends_on("cmake", when="+s3")
conflicts("+cufile", when="~cuda")
def edit(self, spec, prefix):
os.mkdir(prefix.bin)
os.environ["INST_PATH"] = prefix.bin
if "+s3" in spec:
os.environ["S3_SUPPORT"] = "1"
if "+cuda" in spec:
os.environ["CUDA_SUPPORT"] = "1"
if "+cufile" in spec:
os.environ["CUFILE_SUPPORT"] = "1"
makefile = FileFilter("Makefile")
makefile.filter(r"\s+/etc/bash_completion.d/", f" {prefix}/etc/bash_completion.d/")
makefile.filter(r"-lncurses", "-ltinfo -lncurses")

View File

@ -128,6 +128,10 @@ def headers(self):
headers.directories = [self.prefix.include]
return headers
@when("@:6.0 %apple-clang@15:")
def setup_build_environment(self, env):
env.append_flags("LDFLAGS", "-Wl,-ld_classic")
def enable_or_disable_meta(self, variant, options):
switch = "enable" if "+{0}".format(variant) in self.spec else "disable"
return ["--{0}-{1}".format(switch, option) for option in options]

View File

@ -0,0 +1,194 @@
From 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7 Mon Sep 17 00:00:00 2001
From: Joseph Myers <joseph@codesourcery.com>
Date: Tue, 3 Jul 2012 19:14:59 +0000
Subject: [PATCH] Avoid use of libgcc_s and libgcc_eh when building glibc.
diff --git a/Makeconfig b/Makeconfig
index 47638b13c6..6384e22a72 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -423,7 +423,7 @@ endif
# Command for linking programs with the C library.
ifndef +link
-+link = $(CC) -nostdlib -nostartfiles -o $@ \
++link-before-libc = $(CC) -nostdlib -nostartfiles -o $@ \
$(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
$(combreloc-LDFLAGS) $(relro-LDFLAGS) $(hashstyle-LDFLAGS) \
$(addprefix $(csu-objpfx),$(start-installed-name)) \
@@ -432,7 +432,10 @@ ifndef +link
$(start-installed-name))\
$(+preinit) $(link-extra-libs) \
$(common-objpfx)libc% $(+postinit),$^) \
- $(link-extra-libs) $(link-libc) $(+postctor) $(+postinit)
+ $(link-extra-libs)
++link-after-libc = $(+postctor) $(+postinit)
++link = $(+link-before-libc) $(link-libc) $(+link-after-libc)
++link-tests = $(+link-before-libc) $(link-libc-tests) $(+link-after-libc)
endif
# Command for linking PIE programs with the C library.
ifndef +link-pie
@@ -449,7 +452,7 @@ ifndef +link-pie
endif
# Command for statically linking programs with the C library.
ifndef +link-static
-+link-static = $(CC) -nostdlib -nostartfiles -static -o $@ \
++link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \
$(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
$(addprefix $(csu-objpfx),$(static-start-installed-name)) \
$(+preinit) $(+prector) \
@@ -457,7 +460,12 @@ ifndef +link-static
$(start-installed-name))\
$(+preinit) $(link-extra-libs-static) \
$(common-objpfx)libc% $(+postinit),$^) \
- $(link-extra-libs-static) $(link-libc-static) $(+postctor) $(+postinit)
+ $(link-extra-libs-static) $(link-libc-static)
++link-static-after-libc = $(+postctor) $(+postinit)
++link-static = $(+link-static-before-libc) $(link-libc-static) \
+ $(+link-static-after-libc)
++link-static-tests = $(+link-static-before-libc) $(link-libc-static-tests) \
+ $(+link-static-after-libc)
endif
# Command for statically linking bounded-pointer programs with the C library.
ifndef +link-bounded
@@ -482,9 +490,11 @@ ifeq ($(elf),yes)
# We need the versioned name of libc.so in the deps of $(others) et al
# so that the symlink to libc.so is created before anything tries to
# run the linked programs.
-link-libc = -Wl,-rpath-link=$(rpath-link) \
+link-libc-before-gnulib = -Wl,-rpath-link=$(rpath-link) \
$(common-objpfx)libc.so$(libc.so-version) \
- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib)
+ $(common-objpfx)$(patsubst %,$(libtype.oS),c)
+link-libc = $(link-libc-before-gnulib) $(gnulib)
+link-libc-tests = $(link-libc-before-gnulib) $(gnulib-tests)
# This is how to find at build-time things that will be installed there.
rpath-dirs = math elf dlfcn nss nis rt resolv crypt
endif
@@ -495,6 +505,7 @@ else
nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
resolvobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)resolv)
link-libc = $(common-objpfx)libc.a $(otherlibs) $(gnulib) $(common-objpfx)libc.a $(gnulib)
+link-libc-tests = $(common-objpfx)libc.a $(otherlibs) $(gnulib-tests) $(common-objpfx)libc.a $(gnulib-tests)
endif
endif
@@ -523,6 +534,7 @@ endif
# The static libraries.
ifeq (yes,$(build-static))
link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(common-objpfx)libc.a
+link-libc-static-tests = $(common-objpfx)libc.a $(static-gnulib-tests) $(common-objpfx)libc.a
else
ifeq (yes,$(build-shared))
# We can try to link the programs with lib*_pic.a...
@@ -542,8 +554,12 @@ ifneq ($(have-as-needed),yes)
else
libgcc_eh := -Wl,--as-needed -lgcc_s$(libgcc_s_suffix) $(libunwind) -Wl,--no-as-needed
endif
-gnulib := -lgcc $(libgcc_eh)
-static-gnulib := -lgcc -lgcc_eh $(libunwind)
+gnulib-arch =
+gnulib = -lgcc $(gnulib-arch)
+gnulib-tests := -lgcc $(libgcc_eh)
+static-gnulib-arch =
+static-gnulib = -lgcc $(static-gnulib-arch)
+static-gnulib-tests := -lgcc -lgcc_eh $(libunwind)
libc.so-gnulib := -lgcc
endif
ifeq ($(elf),yes)
diff --git a/Rules b/Rules
index 5ace24cee0..45eb7541dc 100644
--- a/Rules
+++ b/Rules
@@ -104,29 +104,52 @@ xtests: tests $(xtests:%=$(objpfx)%.out) $(xtests-bp.out)
endif
ifeq ($(build-programs),yes)
-binaries-all = $(others) $(sysdep-others) $(tests) $(xtests) $(test-srcs)
-binaries-static = $(others-static) $(tests-static) $(xtests-static)
+binaries-all-notests = $(others) $(sysdep-others)
+binaries-all-tests = $(tests) $(xtests) $(test-srcs)
+binaries-all = $(binaries-all-notests) $(binaries-all-tests)
+binaries-static-notests = $(others-static)
+binaries-static-tests = $(tests-static) $(xtests-static)
+binaries-static = $(binaries-static-notests) $(binaries-static-tests)
else
-binaries-all = $(tests) $(xtests) $(test-srcs)
+binaries-all-notests =
+binaries-all-tests = $(tests) $(xtests) $(test-srcs)
+binaries-all = $(binaries-all-tests)
+binaries-static-notests =
+binaries-static-tests =
binaries-static =
endif
-binaries-shared = $(filter-out $(binaries-static), $(binaries-all))
+binaries-shared-tests = $(filter-out $(binaries-static), $(binaries-all-tests))
+binaries-shared-notests = $(filter-out $(binaries-static), $(binaries-all-notests))
-ifneq "$(strip $(binaries-shared))" ""
-$(addprefix $(objpfx),$(binaries-shared)): %: %.o \
+ifneq "$(strip $(binaries-shared-notests))" ""
+$(addprefix $(objpfx),$(binaries-shared-notests)): %: %.o \
$(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
$(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
$(+link)
endif
-ifneq "$(strip $(binaries-static))" ""
-$(addprefix $(objpfx),$(binaries-static)): %: %.o \
+ifneq "$(strip $(binaries-shared-tests))" ""
+$(addprefix $(objpfx),$(binaries-shared-tests)): %: %.o \
+ $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
+ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
+ $(+link-tests)
+endif
+
+ifneq "$(strip $(binaries-static-notests))" ""
+$(addprefix $(objpfx),$(binaries-static-notests)): %: %.o \
$(sort $(filter $(common-objpfx)lib%,$(link-libc-static))) \
$(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
$(+link-static)
endif
+ifneq "$(strip $(binaries-static-tests))" ""
+$(addprefix $(objpfx),$(binaries-static-tests)): %: %.o \
+ $(sort $(filter $(common-objpfx)lib%,$(link-libc-static-tests))) \
+ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
+ $(+link-static-tests)
+endif
+
ifeq ($(build-bounded),yes)
binaries-bounded = $(addsuffix -bp,$(tests) $(xtests) $(test-srcs))
$(addprefix $(objpfx),$(binaries-bounded)): %-bp: %.ob \
diff --git a/elf/Makefile b/elf/Makefile
index 34609a0f85..84709920e8 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -150,6 +150,8 @@ others = sprof sln
install-bin = sprof
others-static = sln
install-rootsbin = sln
+sln-modules := static-stubs
+extra-objs += $(sln-modules:=.o)
ifeq (yes,$(use-ldconfig))
ifeq (yes,$(build-shared))
@@ -157,7 +159,7 @@ others-static += ldconfig
others += ldconfig
install-rootsbin += ldconfig
-ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon
+ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon static-stubs
extra-objs += $(ldconfig-modules:=.o)
# To find xmalloc.c and xstrdup.c
@@ -448,6 +450,8 @@ $(objpfx)ldd: ldd.bash.in $(common-objpfx)soversions.mk \
$(objpfx)sprof: $(libdl)
+$(objpfx)sln: $(sln-modules:%=$(objpfx)%.o)
+
$(objpfx)ldconfig: $(ldconfig-modules:%=$(objpfx)%.o)
SYSCONF-FLAGS := -D'SYSCONFDIR="$(sysconfdir)"'
CFLAGS-ldconfig.c = $(SYSCONF-FLAGS) -D'LIBDIR="$(libdir)"' \

View File

@ -0,0 +1,195 @@
From 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7 Mon Sep 17 00:00:00 2001
From: Joseph Myers <joseph@codesourcery.com>
Date: Tue, 3 Jul 2012 19:14:59 +0000
Subject: [PATCH] Avoid use of libgcc_s and libgcc_eh when building glibc.
diff --git a/Makeconfig b/Makeconfig
index e5cbf646fa..870a4bec4f 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -431,7 +431,7 @@ endif
# Command for linking programs with the C library.
ifndef +link
-+link = $(CC) -nostdlib -nostartfiles -o $@ \
++link-before-libc = $(CC) -nostdlib -nostartfiles -o $@ \
$(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
$(combreloc-LDFLAGS) $(relro-LDFLAGS) $(hashstyle-LDFLAGS) \
$(addprefix $(csu-objpfx),$(start-installed-name)) \
@@ -440,7 +440,10 @@ ifndef +link
$(start-installed-name))\
$(+preinit) $(link-extra-libs) \
$(common-objpfx)libc% $(+postinit),$^) \
- $(link-extra-libs) $(link-libc) $(+postctor) $(+postinit)
+ $(link-extra-libs)
++link-after-libc = $(+postctor) $(+postinit)
++link = $(+link-before-libc) $(link-libc) $(+link-after-libc)
++link-tests = $(+link-before-libc) $(link-libc-tests) $(+link-after-libc)
endif
# Command for linking PIE programs with the C library.
ifndef +link-pie
@@ -457,7 +460,7 @@ ifndef +link-pie
endif
# Command for statically linking programs with the C library.
ifndef +link-static
-+link-static = $(CC) -nostdlib -nostartfiles -static -o $@ \
++link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \
$(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
$(addprefix $(csu-objpfx),$(static-start-installed-name)) \
$(+preinit) $(+prector) \
@@ -465,7 +468,12 @@ ifndef +link-static
$(start-installed-name))\
$(+preinit) $(link-extra-libs-static) \
$(common-objpfx)libc% $(+postinit),$^) \
- $(link-extra-libs-static) $(link-libc-static) $(+postctor) $(+postinit)
+ $(link-extra-libs-static) $(link-libc-static)
++link-static-after-libc = $(+postctor) $(+postinit)
++link-static = $(+link-static-before-libc) $(link-libc-static) \
+ $(+link-static-after-libc)
++link-static-tests = $(+link-static-before-libc) $(link-libc-static-tests) \
+ $(+link-static-after-libc)
endif
# Command for statically linking bounded-pointer programs with the C library.
ifndef +link-bounded
@@ -490,10 +498,12 @@ ifeq ($(elf),yes)
# We need the versioned name of libc.so in the deps of $(others) et al
# so that the symlink to libc.so is created before anything tries to
# run the linked programs.
-link-libc = -Wl,-rpath-link=$(rpath-link) \
+link-libc-before-gnulib = -Wl,-rpath-link=$(rpath-link) \
$(common-objpfx)libc.so$(libc.so-version) \
$(common-objpfx)$(patsubst %,$(libtype.oS),c) \
- $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed) $(gnulib)
+ $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed)
+link-libc = $(link-libc-before-gnulib) $(gnulib)
+link-libc-tests = $(link-libc-before-gnulib) $(gnulib-tests)
# This is how to find at build-time things that will be installed there.
rpath-dirs = math elf dlfcn nss nis rt resolv crypt
endif
@@ -504,6 +514,7 @@ else
nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
resolvobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)resolv)
link-libc = $(common-objpfx)libc.a $(otherlibs) $(gnulib) $(common-objpfx)libc.a $(gnulib)
+link-libc-tests = $(common-objpfx)libc.a $(otherlibs) $(gnulib-tests) $(common-objpfx)libc.a $(gnulib-tests)
endif
endif
@@ -532,6 +543,7 @@ endif
# The static libraries.
ifeq (yes,$(build-static))
link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(common-objpfx)libc.a
+link-libc-static-tests = $(common-objpfx)libc.a $(static-gnulib-tests) $(common-objpfx)libc.a
else
ifeq (yes,$(build-shared))
# We can try to link the programs with lib*_pic.a...
@@ -551,8 +563,12 @@ ifneq ($(have-as-needed),yes)
else
libgcc_eh := -Wl,--as-needed -lgcc_s$(libgcc_s_suffix) $(libunwind) -Wl,--no-as-needed
endif
-gnulib := -lgcc $(libgcc_eh)
-static-gnulib := -lgcc -lgcc_eh $(libunwind)
+gnulib-arch =
+gnulib = -lgcc $(gnulib-arch)
+gnulib-tests := -lgcc $(libgcc_eh)
+static-gnulib-arch =
+static-gnulib = -lgcc $(static-gnulib-arch)
+static-gnulib-tests := -lgcc -lgcc_eh $(libunwind)
libc.so-gnulib := -lgcc
endif
ifeq ($(elf),yes)
diff --git a/Rules b/Rules
index 5ace24cee0..45eb7541dc 100644
--- a/Rules
+++ b/Rules
@@ -104,29 +104,52 @@ xtests: tests $(xtests:%=$(objpfx)%.out) $(xtests-bp.out)
endif
ifeq ($(build-programs),yes)
-binaries-all = $(others) $(sysdep-others) $(tests) $(xtests) $(test-srcs)
-binaries-static = $(others-static) $(tests-static) $(xtests-static)
+binaries-all-notests = $(others) $(sysdep-others)
+binaries-all-tests = $(tests) $(xtests) $(test-srcs)
+binaries-all = $(binaries-all-notests) $(binaries-all-tests)
+binaries-static-notests = $(others-static)
+binaries-static-tests = $(tests-static) $(xtests-static)
+binaries-static = $(binaries-static-notests) $(binaries-static-tests)
else
-binaries-all = $(tests) $(xtests) $(test-srcs)
+binaries-all-notests =
+binaries-all-tests = $(tests) $(xtests) $(test-srcs)
+binaries-all = $(binaries-all-tests)
+binaries-static-notests =
+binaries-static-tests =
binaries-static =
endif
-binaries-shared = $(filter-out $(binaries-static), $(binaries-all))
+binaries-shared-tests = $(filter-out $(binaries-static), $(binaries-all-tests))
+binaries-shared-notests = $(filter-out $(binaries-static), $(binaries-all-notests))
-ifneq "$(strip $(binaries-shared))" ""
-$(addprefix $(objpfx),$(binaries-shared)): %: %.o \
+ifneq "$(strip $(binaries-shared-notests))" ""
+$(addprefix $(objpfx),$(binaries-shared-notests)): %: %.o \
$(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
$(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
$(+link)
endif
-ifneq "$(strip $(binaries-static))" ""
-$(addprefix $(objpfx),$(binaries-static)): %: %.o \
+ifneq "$(strip $(binaries-shared-tests))" ""
+$(addprefix $(objpfx),$(binaries-shared-tests)): %: %.o \
+ $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
+ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
+ $(+link-tests)
+endif
+
+ifneq "$(strip $(binaries-static-notests))" ""
+$(addprefix $(objpfx),$(binaries-static-notests)): %: %.o \
$(sort $(filter $(common-objpfx)lib%,$(link-libc-static))) \
$(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
$(+link-static)
endif
+ifneq "$(strip $(binaries-static-tests))" ""
+$(addprefix $(objpfx),$(binaries-static-tests)): %: %.o \
+ $(sort $(filter $(common-objpfx)lib%,$(link-libc-static-tests))) \
+ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
+ $(+link-static-tests)
+endif
+
ifeq ($(build-bounded),yes)
binaries-bounded = $(addsuffix -bp,$(tests) $(xtests) $(test-srcs))
$(addprefix $(objpfx),$(binaries-bounded)): %-bp: %.ob \
diff --git a/elf/Makefile b/elf/Makefile
index 2d2d568013..fe1924ebd4 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -150,6 +150,8 @@ others = sprof sln
install-bin = sprof
others-static = sln
install-rootsbin = sln
+sln-modules := static-stubs
+extra-objs += $(sln-modules:=.o)
ifeq (yes,$(use-ldconfig))
ifeq (yes,$(build-shared))
@@ -157,7 +159,7 @@ others-static += ldconfig
others += ldconfig
install-rootsbin += ldconfig
-ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon
+ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon static-stubs
extra-objs += $(ldconfig-modules:=.o)
# To find xmalloc.c and xstrdup.c
@@ -458,6 +460,8 @@ $(objpfx)ldd: ldd.bash.in $(common-objpfx)soversions.mk \
$(objpfx)sprof: $(libdl)
+$(objpfx)sln: $(sln-modules:%=$(objpfx)%.o)
+
$(objpfx)ldconfig: $(ldconfig-modules:%=$(objpfx)%.o)
SYSCONF-FLAGS := -D'SYSCONFDIR="$(sysconfdir)"'
CFLAGS-ldconfig.c = $(SYSCONF-FLAGS) -D'LIBDIR="$(libdir)"' \

View File

@ -0,0 +1,211 @@
From 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7 Mon Sep 17 00:00:00 2001
From: Joseph Myers <joseph@codesourcery.com>
Date: Tue, 3 Jul 2012 19:14:59 +0000
Subject: [PATCH] Avoid use of libgcc_s and libgcc_eh when building glibc.
diff --git a/Makeconfig b/Makeconfig
index 8195245052..b23cee8723 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -447,7 +447,7 @@ endif
# Command for linking programs with the C library.
ifndef +link
-+link = $(CC) -nostdlib -nostartfiles -o $@ \
++link-before-libc = $(CC) -nostdlib -nostartfiles -o $@ \
$(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
$(combreloc-LDFLAGS) $(relro-LDFLAGS) $(hashstyle-LDFLAGS) \
$(addprefix $(csu-objpfx),$(start-installed-name)) \
@@ -456,7 +456,10 @@ ifndef +link
$(start-installed-name))\
$(+preinit) $(link-extra-libs) \
$(common-objpfx)libc% $(+postinit),$^) \
- $(link-extra-libs) $(link-libc) $(+postctor) $(+postinit)
+ $(link-extra-libs)
++link-after-libc = $(+postctor) $(+postinit)
++link = $(+link-before-libc) $(link-libc) $(+link-after-libc)
++link-tests = $(+link-before-libc) $(link-libc-tests) $(+link-after-libc)
endif
# Command for linking PIE programs with the C library.
ifndef +link-pie
@@ -473,7 +476,7 @@ ifndef +link-pie
endif
# Command for statically linking programs with the C library.
ifndef +link-static
-+link-static = $(CC) -nostdlib -nostartfiles -static -o $@ \
++link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \
$(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
$(addprefix $(csu-objpfx),$(static-start-installed-name)) \
$(+preinit) $(+prector) \
@@ -481,7 +484,12 @@ ifndef +link-static
$(start-installed-name))\
$(+preinit) $(link-extra-libs-static) \
$(common-objpfx)libc% $(+postinit),$^) \
- $(link-extra-libs-static) $(link-libc-static) $(+postctor) $(+postinit)
+ $(link-extra-libs-static) $(link-libc-static)
++link-static-after-libc = $(+postctor) $(+postinit)
++link-static = $(+link-static-before-libc) $(link-libc-static) \
+ $(+link-static-after-libc)
++link-static-tests = $(+link-static-before-libc) $(link-libc-static-tests) \
+ $(+link-static-after-libc)
endif
# Command for statically linking bounded-pointer programs with the C library.
ifndef +link-bounded
@@ -506,10 +514,12 @@ ifeq ($(elf),yes)
# We need the versioned name of libc.so in the deps of $(others) et al
# so that the symlink to libc.so is created before anything tries to
# run the linked programs.
-link-libc = -Wl,-rpath-link=$(rpath-link) \
+link-libc-before-gnulib = -Wl,-rpath-link=$(rpath-link) \
$(common-objpfx)libc.so$(libc.so-version) \
$(common-objpfx)$(patsubst %,$(libtype.oS),c) \
- $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed) $(gnulib)
+ $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed)
+link-libc = $(link-libc-before-gnulib) $(gnulib)
+link-libc-tests = $(link-libc-before-gnulib) $(gnulib-tests)
# This is how to find at build-time things that will be installed there.
rpath-dirs = math elf dlfcn nss nis rt resolv crypt
endif
@@ -520,6 +530,7 @@ else
nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
resolvobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)resolv)
link-libc = $(common-objpfx)libc.a $(otherlibs) $(gnulib) $(common-objpfx)libc.a $(gnulib)
+link-libc-tests = $(common-objpfx)libc.a $(otherlibs) $(gnulib-tests) $(common-objpfx)libc.a $(gnulib-tests)
endif
endif
@@ -548,6 +559,7 @@ endif
# The static libraries.
ifeq (yes,$(build-static))
link-libc-static = -Wl,--start-group $(common-objpfx)libc.a $(static-gnulib) -Wl,--end-group
+link-libc-static-tests = -Wl,--start-group $(common-objpfx)libc.a $(static-gnulib-tests) -Wl,--end-group
else
ifeq (yes,$(build-shared))
# We can try to link the programs with lib*_pic.a...
@@ -567,8 +579,12 @@ ifneq ($(have-as-needed),yes)
else
libgcc_eh := -Wl,--as-needed -lgcc_s$(libgcc_s_suffix) $(libunwind) -Wl,--no-as-needed
endif
-gnulib := -lgcc $(libgcc_eh)
-static-gnulib := -lgcc -lgcc_eh $(libunwind)
+gnulib-arch =
+gnulib = -lgcc $(gnulib-arch)
+gnulib-tests := -lgcc $(libgcc_eh)
+static-gnulib-arch =
+static-gnulib = -lgcc $(static-gnulib-arch)
+static-gnulib-tests := -lgcc -lgcc_eh $(libunwind)
libc.so-gnulib := -lgcc
endif
ifeq ($(elf),yes)
diff --git a/Rules b/Rules
index 00f03df6da..4a31d2905c 100644
--- a/Rules
+++ b/Rules
@@ -104,29 +104,46 @@ xtests: tests $(xtests:%=$(objpfx)%.out) $(xtests-bp.out)
endif
ifeq ($(build-programs),yes)
-binaries-all = $(others) $(sysdep-others) $(tests) $(xtests) $(test-srcs)
-binaries-static = $(others-static) $(tests-static) $(xtests-static)
+binaries-all-notests = $(others) $(sysdep-others)
+binaries-all-tests = $(tests) $(xtests) $(test-srcs)
+binaries-all = $(binaries-all-notests) $(binaries-all-tests)
+binaries-static-notests = $(others-static)
+binaries-static-tests = $(tests-static) $(xtests-static)
+binaries-static = $(binaries-static-notests) $(binaries-static-tests)
ifeq (yesyes,$(have-fpie)$(build-shared))
binaries-pie = $(others-pie) $(tests-pie) $(xtests-pie)
else
binaries-pie =
endif
else
-binaries-all = $(tests) $(xtests) $(test-srcs)
+binaries-all-notests =
+binaries-all-tests = $(tests) $(xtests) $(test-srcs)
+binaries-all = $(binaries-all-tests)
+binaries-static-notests =
+binaries-static-tests =
binaries-static =
binaries-pie =
endif
-binaries-shared = $(filter-out $(binaries-pie) $(binaries-static), \
- $(binaries-all))
+binaries-shared-tests = $(filter-out $(binaries-pie) $(binaries-static), \
+ $(binaries-all-tests))
+binaries-shared-notests = $(filter-out $(binaries-pie) $(binaries-static), \
+ $(binaries-all-notests))
-ifneq "$(strip $(binaries-shared))" ""
-$(addprefix $(objpfx),$(binaries-shared)): %: %.o \
+ifneq "$(strip $(binaries-shared-notests))" ""
+$(addprefix $(objpfx),$(binaries-shared-notests)): %: %.o \
$(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
$(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
$(+link)
endif
+ifneq "$(strip $(binaries-shared-tests))" ""
+$(addprefix $(objpfx),$(binaries-shared-tests)): %: %.o \
+ $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
+ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
+ $(+link-tests)
+endif
+
ifneq "$(strip $(binaries-pie))" ""
$(addprefix $(objpfx),$(binaries-pie)): %: %.o \
$(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
@@ -134,13 +151,20 @@ $(addprefix $(objpfx),$(binaries-pie)): %: %.o \
$(+link-pie)
endif
-ifneq "$(strip $(binaries-static))" ""
-$(addprefix $(objpfx),$(binaries-static)): %: %.o \
+ifneq "$(strip $(binaries-static-notests))" ""
+$(addprefix $(objpfx),$(binaries-static-notests)): %: %.o \
$(sort $(filter $(common-objpfx)lib%,$(link-libc-static))) \
$(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
$(+link-static)
endif
+ifneq "$(strip $(binaries-static-tests))" ""
+$(addprefix $(objpfx),$(binaries-static-tests)): %: %.o \
+ $(sort $(filter $(common-objpfx)lib%,$(link-libc-static-tests))) \
+ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
+ $(+link-static-tests)
+endif
+
ifeq ($(build-bounded),yes)
binaries-bounded = $(addsuffix -bp,$(tests) $(xtests) $(test-srcs))
$(addprefix $(objpfx),$(binaries-bounded)): %-bp: %.ob \
diff --git a/elf/Makefile b/elf/Makefile
index f20f52dee1..64555b9243 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -156,6 +156,8 @@ others = sprof sln pldd
install-bin = sprof pldd
others-static = sln
install-rootsbin = sln
+sln-modules := static-stubs
+extra-objs += $(sln-modules:=.o)
ifeq (yes,$(use-ldconfig))
ifeq (yes,$(build-shared))
@@ -163,7 +165,7 @@ others-static += ldconfig
others += ldconfig
install-rootsbin += ldconfig
-ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon
+ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon static-stubs
extra-objs += $(ldconfig-modules:=.o)
pldd-modules := xmalloc
@@ -495,6 +497,8 @@ $(objpfx)ldd: ldd.bash.in $(common-objpfx)soversions.mk \
$(objpfx)sprof: $(libdl)
+$(objpfx)sln: $(sln-modules:%=$(objpfx)%.o)
+
$(objpfx)ldconfig: $(ldconfig-modules:%=$(objpfx)%.o)
$(objpfx)pldd: $(pldd-modules:%=$(objpfx)%.o)

View File

@ -0,0 +1,214 @@
From 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7 Mon Sep 17 00:00:00 2001
From: Joseph Myers <joseph@codesourcery.com>
Date: Tue, 3 Jul 2012 19:14:59 +0000
Subject: [PATCH] Avoid use of libgcc_s and libgcc_eh when building glibc.
diff --git a/Makeconfig b/Makeconfig
index 417fa508a6..c860e68cdd 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -415,9 +415,9 @@ LDFLAGS.so += $(hashstyle-LDFLAGS)
LDFLAGS-rtld += $(hashstyle-LDFLAGS)
endif
-# Command for linking programs with the C library.
+# Commands for linking programs with the C library.
ifndef +link
-+link = $(CC) -nostdlib -nostartfiles -o $@ \
++link-before-libc = $(CC) -nostdlib -nostartfiles -o $@ \
$(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
$(combreloc-LDFLAGS) $(relro-LDFLAGS) $(hashstyle-LDFLAGS) \
$(addprefix $(csu-objpfx),$(start-installed-name)) \
@@ -426,7 +426,10 @@ ifndef +link
$(start-installed-name))\
$(+preinit) $(link-extra-libs) \
$(common-objpfx)libc% $(+postinit),$^) \
- $(link-extra-libs) $(link-libc) $(+postctor) $(+postinit)
+ $(link-extra-libs)
++link-after-libc = $(+postctor) $(+postinit)
++link = $(+link-before-libc) $(link-libc) $(+link-after-libc)
++link-tests = $(+link-before-libc) $(link-libc-tests) $(+link-after-libc)
endif
# Command for linking PIE programs with the C library.
ifndef +link-pie
@@ -443,7 +446,7 @@ ifndef +link-pie
endif
# Command for statically linking programs with the C library.
ifndef +link-static
-+link-static = $(CC) -nostdlib -nostartfiles -static -o $@ \
++link-static-before-libc = $(CC) -nostdlib -nostartfiles -static -o $@ \
$(sysdep-LDFLAGS) $(LDFLAGS) $(LDFLAGS-$(@F)) \
$(addprefix $(csu-objpfx),$(static-start-installed-name)) \
$(+preinit) $(+prector) \
@@ -451,7 +454,12 @@ ifndef +link-static
$(start-installed-name))\
$(+preinit) $(link-extra-libs-static) \
$(common-objpfx)libc% $(+postinit),$^) \
- $(link-extra-libs-static) $(link-libc-static) $(+postctor) $(+postinit)
+ $(link-extra-libs-static) $(link-libc-static)
++link-static-after-libc = $(+postctor) $(+postinit)
++link-static = $(+link-static-before-libc) $(link-libc-static) \
+ $(+link-static-after-libc)
++link-static-tests = $(+link-static-before-libc) $(link-libc-static-tests) \
+ $(+link-static-after-libc)
endif
# Command for statically linking bounded-pointer programs with the C library.
ifndef +link-bounded
@@ -475,10 +483,12 @@ ifeq (yes,$(build-shared))
# We need the versioned name of libc.so in the deps of $(others) et al
# so that the symlink to libc.so is created before anything tries to
# run the linked programs.
-link-libc = -Wl,-rpath-link=$(rpath-link) \
+link-libc-before-gnulib = -Wl,-rpath-link=$(rpath-link) \
$(common-objpfx)libc.so$(libc.so-version) \
$(common-objpfx)$(patsubst %,$(libtype.oS),c) \
- $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed) $(gnulib)
+ $(as-needed) $(common-objpfx)elf/ld.so $(no-as-needed)
+link-libc = $(link-libc-before-gnulib) $(gnulib)
+link-libc-tests = $(link-libc-before-gnulib) $(gnulib-tests)
# This is how to find at build-time things that will be installed there.
rpath-dirs = math elf dlfcn nss nis rt resolv crypt
rpath-link = \
@@ -488,6 +498,7 @@ else
nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss)
resolvobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)resolv)
link-libc = $(common-objpfx)libc.a $(otherlibs) $(gnulib) $(common-objpfx)libc.a $(gnulib)
+link-libc-tests = $(common-objpfx)libc.a $(otherlibs) $(gnulib-tests) $(common-objpfx)libc.a $(gnulib-tests)
endif
endif
@@ -513,6 +524,7 @@ endif
# The static libraries.
link-libc-static = -Wl,--start-group $(common-objpfx)libc.a $(static-gnulib) -Wl,--end-group
+link-libc-static-tests = -Wl,--start-group $(common-objpfx)libc.a $(static-gnulib-tests) -Wl,--end-group
link-libc-bounded = $(common-objpfx)libc_b.a $(gnulib) $(common-objpfx)libc_b.a
ifndef gnulib
@@ -522,8 +534,12 @@ else
libunwind = -lunwind
endif
libgcc_eh := -Wl,--as-needed -lgcc_s $(libunwind) -Wl,--no-as-needed
-gnulib := -lgcc $(libgcc_eh)
-static-gnulib := -lgcc -lgcc_eh $(libunwind)
+gnulib-arch =
+gnulib = -lgcc $(gnulib-arch)
+gnulib-tests := -lgcc $(libgcc_eh)
+static-gnulib-arch =
+static-gnulib = -lgcc $(static-gnulib-arch)
+static-gnulib-tests := -lgcc -lgcc_eh $(libunwind)
libc.so-gnulib := -lgcc
endif
+preinit = $(addprefix $(csu-objpfx),crti.o)
diff --git a/Rules b/Rules
index 3c61a2933b..be3a738574 100644
--- a/Rules
+++ b/Rules
@@ -103,29 +103,46 @@ xtests: tests $(xtests:%=$(objpfx)%.out) $(xtests-bp.out)
endif
ifeq ($(build-programs),yes)
-binaries-all = $(others) $(sysdep-others) $(tests) $(xtests) $(test-srcs)
-binaries-static = $(others-static) $(tests-static) $(xtests-static)
+binaries-all-notests = $(others) $(sysdep-others)
+binaries-all-tests = $(tests) $(xtests) $(test-srcs)
+binaries-all = $(binaries-all-notests) $(binaries-all-tests)
+binaries-static-notests = $(others-static)
+binaries-static-tests = $(tests-static) $(xtests-static)
+binaries-static = $(binaries-static-notests) $(binaries-static-tests)
ifeq (yesyes,$(have-fpie)$(build-shared))
binaries-pie = $(others-pie) $(tests-pie) $(xtests-pie)
else
binaries-pie =
endif
else
-binaries-all = $(tests) $(xtests) $(test-srcs)
+binaries-all-notests =
+binaries-all-tests = $(tests) $(xtests) $(test-srcs)
+binaries-all = $(binaries-all-tests)
+binaries-static-notests =
+binaries-static-tests =
binaries-static =
binaries-pie =
endif
-binaries-shared = $(filter-out $(binaries-pie) $(binaries-static), \
- $(binaries-all))
+binaries-shared-tests = $(filter-out $(binaries-pie) $(binaries-static), \
+ $(binaries-all-tests))
+binaries-shared-notests = $(filter-out $(binaries-pie) $(binaries-static), \
+ $(binaries-all-notests))
-ifneq "$(strip $(binaries-shared))" ""
-$(addprefix $(objpfx),$(binaries-shared)): %: %.o \
+ifneq "$(strip $(binaries-shared-notests))" ""
+$(addprefix $(objpfx),$(binaries-shared-notests)): %: %.o \
$(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
$(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
$(+link)
endif
+ifneq "$(strip $(binaries-shared-tests))" ""
+$(addprefix $(objpfx),$(binaries-shared-tests)): %: %.o \
+ $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
+ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
+ $(+link-tests)
+endif
+
ifneq "$(strip $(binaries-pie))" ""
$(addprefix $(objpfx),$(binaries-pie)): %: %.o \
$(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
@@ -133,13 +150,20 @@ $(addprefix $(objpfx),$(binaries-pie)): %: %.o \
$(+link-pie)
endif
-ifneq "$(strip $(binaries-static))" ""
-$(addprefix $(objpfx),$(binaries-static)): %: %.o \
+ifneq "$(strip $(binaries-static-notests))" ""
+$(addprefix $(objpfx),$(binaries-static-notests)): %: %.o \
$(sort $(filter $(common-objpfx)lib%,$(link-libc-static))) \
$(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
$(+link-static)
endif
+ifneq "$(strip $(binaries-static-tests))" ""
+$(addprefix $(objpfx),$(binaries-static-tests)): %: %.o \
+ $(sort $(filter $(common-objpfx)lib%,$(link-libc-static-tests))) \
+ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
+ $(+link-static-tests)
+endif
+
ifeq ($(build-bounded),yes)
binaries-bounded = $(addsuffix -bp,$(tests) $(xtests) $(test-srcs))
$(addprefix $(objpfx),$(binaries-bounded)): %-bp: %.ob \
diff --git a/elf/Makefile b/elf/Makefile
index 0c26ce545a..90541991d2 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -71,6 +71,8 @@ others = sprof sln pldd
install-bin = sprof pldd
others-static = sln
install-rootsbin = sln
+sln-modules := static-stubs
+extra-objs += $(sln-modules:=.o)
ifeq (yes,$(use-ldconfig))
ifeq (yes,$(build-shared))
@@ -78,7 +80,7 @@ others-static += ldconfig
others += ldconfig
install-rootsbin += ldconfig
-ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon
+ldconfig-modules := cache readlib xmalloc xstrdup chroot_canon static-stubs
extra-objs += $(ldconfig-modules:=.o)
endif
endif
@@ -411,6 +413,8 @@ $(objpfx)ldd: ldd.bash.in $(common-objpfx)soversions.mk \
$(objpfx)sprof: $(libdl)
+$(objpfx)sln: $(sln-modules:%=$(objpfx)%.o)
+
$(objpfx)ldconfig: $(ldconfig-modules:%=$(objpfx)%.o)
$(objpfx)pldd: $(pldd-modules:%=$(objpfx)%.o)

View File

@ -0,0 +1,57 @@
From 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7 Mon Sep 17 00:00:00 2001
From: Joseph Myers <joseph@codesourcery.com>
Date: Tue, 3 Jul 2012 19:14:59 +0000
Subject: [PATCH] Avoid use of libgcc_s and libgcc_eh when building glibc.
diff --git a/elf/static-stubs.c b/elf/static-stubs.c
new file mode 100644
index 0000000000..6c5eebc3fb
--- /dev/null
+++ b/elf/static-stubs.c
@@ -0,0 +1,46 @@
+/* Stub implementations of functions to link into statically linked
+ programs without needing libgcc_eh.
+ Copyright (C) 2012 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+/* Avoid backtrace (and so _Unwind_Backtrace) dependencies from
+ sysdeps/unix/sysv/linux/libc_fatal.c. */
+#include <sysdeps/posix/libc_fatal.c>
+
+#include <stdlib.h>
+#include <unwind.h>
+
+/* These programs do not use thread cancellation, so _Unwind_Resume
+ and the personality routine are never actually called. */
+
+void
+_Unwind_Resume (struct _Unwind_Exception *exc __attribute__ ((unused)))
+{
+ abort ();
+}
+
+_Unwind_Reason_Code
+__gcc_personality_v0 (int version __attribute__ ((unused)),
+ _Unwind_Action actions __attribute__ ((unused)),
+ _Unwind_Exception_Class exception_class
+ __attribute__ ((unused)),
+ struct _Unwind_Exception *ue_header
+ __attribute__ ((unused)),
+ struct _Unwind_Context *context __attribute__ ((unused)))
+{
+ abort ();
+}

View File

@ -0,0 +1,176 @@
diff --git a/csu/libc-start.c b/csu/libc-start.c
index 194db6b1ec..f85ec9604e 100644
--- a/csu/libc-start.c
+++ b/csu/libc-start.c
@@ -151,8 +151,8 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
# ifndef SHARED
/* Set up the stack checker's canary. */
- uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard ();
-# ifdef THREAD_SET_STACK_GUARD
+ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
+# ifdef THREAD_SET_STACK_GUARD
THREAD_SET_STACK_GUARD (stack_chk_guard);
# else
__stack_chk_guard = stack_chk_guard;
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 4b7be6bc27..f62867abf1 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -84,6 +84,9 @@ struct r_scope_elem _dl_initial_searchlist;
int _dl_starting_up = 1;
#endif
+/* Random data provided by the kernel. */
+void *_dl_random;
+
/* Get architecture specific initializer. */
#include <dl-procinfo.c>
@@ -218,6 +221,9 @@ _dl_aux_init (ElfW(auxv_t) *av)
__libc_enable_secure = av->a_un.a_val;
__libc_enable_secure_decided = 1;
break;
+ case AT_RANDOM:
+ _dl_random = (void *) av->a_un.a_val;
+ break;
}
if (seen == 0xf)
{
diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c
index 68e08f480a..133ba0d29f 100644
--- a/elf/dl-sysdep.c
+++ b/elf/dl-sysdep.c
@@ -62,6 +62,7 @@ int __libc_multiple_libcs = 0; /* Defining this here avoids the inclusion
void *__libc_stack_end attribute_relro = NULL;
rtld_hidden_data_def(__libc_stack_end)
static ElfW(auxv_t) *_dl_auxv attribute_relro;
+void *_dl_random attribute_relro = NULL;
#ifndef DL_FIND_ARG_COMPONENTS
# define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp) \
@@ -173,6 +174,9 @@ _dl_sysdep_start (void **start_argptr,
GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val;
break;
#endif
+ case AT_RANDOM:
+ _dl_random = (void *) av->a_un.a_val;
+ break;
#ifdef DL_PLATFORM_AUXV
DL_PLATFORM_AUXV
#endif
@@ -293,6 +297,7 @@ _dl_show_auxv (void)
[AT_SECURE - 2] = { "AT_SECURE: ", dec },
[AT_SYSINFO - 2] = { "AT_SYSINFO: 0x", hex },
[AT_SYSINFO_EHDR - 2] = { "AT_SYSINFO_EHDR: 0x", hex },
+ [AT_RANDOM - 2] = { "AT_RANDOM: 0x", hex },
};
unsigned int idx = (unsigned int) (av->a_type - 2);
diff --git a/elf/rtld.c b/elf/rtld.c
index a357a46987..a02a319677 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -1837,7 +1837,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
#endif
/* Set up the stack checker's canary. */
- uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard ();
+ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
#ifdef THREAD_SET_STACK_GUARD
THREAD_SET_STACK_GUARD (stack_chk_guard);
#else
diff --git a/sysdeps/generic/dl-osinfo.h b/sysdeps/generic/dl-osinfo.h
index 60b84a900d..02ec28d424 100644
--- a/sysdeps/generic/dl-osinfo.h
+++ b/sysdeps/generic/dl-osinfo.h
@@ -1,12 +1,29 @@
#include <stdint.h>
static inline uintptr_t __attribute__ ((always_inline))
-_dl_setup_stack_chk_guard (void)
+_dl_setup_stack_chk_guard (void *dl_random)
{
- uintptr_t ret = 0;
- unsigned char *p = (unsigned char *) &ret;
- p[sizeof (ret) - 1] = 255;
- p[sizeof (ret) - 2] = '\n';
- p[0] = 0;
+ uintptr_t ret;
+ if (dl_random == NULL)
+ {
+ ret = 0;
+ unsigned char *p = (unsigned char *) &ret;
+ p[sizeof (ret) - 1] = 255;
+ p[sizeof (ret) - 2] = '\n';
+ p[0] = 0;
+ }
+ else
+ memcmp (&ret, dl_random, sizeof (ret));
+ return ret;
+}
+
+static inline uintptr_t __attribute__ ((always_inline))
+_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard)
+{
+ uintptr_t ret;
+ if (dl_random == NULL)
+ ret = stack_chk_guard;
+ else
+ memcmp (&ret, (char *) dl_random + sizeof (ret), sizeof (ret));
return ret;
}
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index eee6141c6a..54789c0639 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -740,6 +740,9 @@ weak_extern (_dl_starting_up)
extern int _dl_starting_up_internal attribute_hidden;
#endif
+/* Random data provided by the kernel. */
+extern void *_dl_random attribute_hidden;
+
/* OS-dependent function to open the zero-fill device. */
extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */
diff --git a/sysdeps/unix/sysv/linux/dl-osinfo.h b/sysdeps/unix/sysv/linux/dl-osinfo.h
index 0738501a56..d796651ff4 100644
--- a/sysdeps/unix/sysv/linux/dl-osinfo.h
+++ b/sysdeps/unix/sysv/linux/dl-osinfo.h
@@ -159,22 +159,20 @@ _dl_discover_osversion (void)
} while (0)
static inline uintptr_t __attribute__ ((always_inline))
-_dl_setup_stack_chk_guard (void)
+_dl_setup_stack_chk_guard (void *dl_random)
{
uintptr_t ret;
-#ifdef ENABLE_STACKGUARD_RANDOMIZE
- int fd = __open ("/dev/urandom", O_RDONLY);
- if (fd >= 0)
- {
- ssize_t reslen = __read (fd, &ret, sizeof (ret));
- __close (fd);
- if (reslen == (ssize_t) sizeof (ret))
- return ret;
- }
-#endif
- ret = 0;
- unsigned char *p = (unsigned char *) &ret;
- p[sizeof (ret) - 1] = 255;
- p[sizeof (ret) - 2] = '\n';
+ /* We need in the moment only 8 bytes on 32-bit platforms and 16
+ bytes on 64-bit platforms. Therefore we can use the data
+ directly and not use the kernel-provided data to seed a PRNG. */
+ memcpy (&ret, dl_random, sizeof (ret));
+ return ret;
+}
+
+static inline uintptr_t __attribute__ ((always_inline))
+_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard)
+{
+ uintptr_t ret;
+ memcpy (&ret, (char *) dl_random + sizeof (ret), sizeof (ret));
return ret;
}

View File

@ -0,0 +1,176 @@
diff --git a/csu/libc-start.c b/csu/libc-start.c
index 0ed993651e..a8b1be8c7d 100644
--- a/csu/libc-start.c
+++ b/csu/libc-start.c
@@ -142,8 +142,8 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
# ifndef SHARED
/* Set up the stack checker's canary. */
- uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard ();
-# ifdef THREAD_SET_STACK_GUARD
+ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
+# ifdef THREAD_SET_STACK_GUARD
THREAD_SET_STACK_GUARD (stack_chk_guard);
# else
__stack_chk_guard = stack_chk_guard;
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 2c11ac6881..321ed07a18 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -84,6 +84,9 @@ struct r_scope_elem _dl_initial_searchlist;
int _dl_starting_up = 1;
#endif
+/* Random data provided by the kernel. */
+void *_dl_random;
+
/* Get architecture specific initializer. */
#include <dl-procinfo.c>
@@ -216,6 +219,9 @@ _dl_aux_init (ElfW(auxv_t) *av)
__libc_enable_secure = av->a_un.a_val;
__libc_enable_secure_decided = 1;
break;
+ case AT_RANDOM:
+ _dl_random = (void *) av->a_un.a_val;
+ break;
# ifdef DL_PLATFORM_AUXV
DL_PLATFORM_AUXV
# endif
diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c
index 85e331a90f..6ce20b5150 100644
--- a/elf/dl-sysdep.c
+++ b/elf/dl-sysdep.c
@@ -62,6 +62,7 @@ int __libc_multiple_libcs = 0; /* Defining this here avoids the inclusion
void *__libc_stack_end attribute_relro = NULL;
rtld_hidden_data_def(__libc_stack_end)
static ElfW(auxv_t) *_dl_auxv attribute_relro;
+void *_dl_random attribute_relro = NULL;
#ifndef DL_FIND_ARG_COMPONENTS
# define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp) \
@@ -173,6 +174,9 @@ _dl_sysdep_start (void **start_argptr,
GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val;
break;
#endif
+ case AT_RANDOM:
+ _dl_random = (void *) av->a_un.a_val;
+ break;
#ifdef DL_PLATFORM_AUXV
DL_PLATFORM_AUXV
#endif
@@ -293,6 +297,7 @@ _dl_show_auxv (void)
[AT_SECURE - 2] = { "AT_SECURE: ", dec },
[AT_SYSINFO - 2] = { "AT_SYSINFO: 0x", hex },
[AT_SYSINFO_EHDR - 2] = { "AT_SYSINFO_EHDR: 0x", hex },
+ [AT_RANDOM - 2] = { "AT_RANDOM: 0x", hex },
};
unsigned int idx = (unsigned int) (av->a_type - 2);
diff --git a/elf/rtld.c b/elf/rtld.c
index 7612a69324..e77ac43713 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -1816,7 +1816,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
tcbp = init_tls ();
/* Set up the stack checker's canary. */
- uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard ();
+ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
#ifdef THREAD_SET_STACK_GUARD
THREAD_SET_STACK_GUARD (stack_chk_guard);
#else
diff --git a/sysdeps/generic/dl-osinfo.h b/sysdeps/generic/dl-osinfo.h
index 60b84a900d..02ec28d424 100644
--- a/sysdeps/generic/dl-osinfo.h
+++ b/sysdeps/generic/dl-osinfo.h
@@ -1,12 +1,29 @@
#include <stdint.h>
static inline uintptr_t __attribute__ ((always_inline))
-_dl_setup_stack_chk_guard (void)
+_dl_setup_stack_chk_guard (void *dl_random)
{
- uintptr_t ret = 0;
- unsigned char *p = (unsigned char *) &ret;
- p[sizeof (ret) - 1] = 255;
- p[sizeof (ret) - 2] = '\n';
- p[0] = 0;
+ uintptr_t ret;
+ if (dl_random == NULL)
+ {
+ ret = 0;
+ unsigned char *p = (unsigned char *) &ret;
+ p[sizeof (ret) - 1] = 255;
+ p[sizeof (ret) - 2] = '\n';
+ p[0] = 0;
+ }
+ else
+ memcmp (&ret, dl_random, sizeof (ret));
+ return ret;
+}
+
+static inline uintptr_t __attribute__ ((always_inline))
+_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard)
+{
+ uintptr_t ret;
+ if (dl_random == NULL)
+ ret = stack_chk_guard;
+ else
+ memcmp (&ret, (char *) dl_random + sizeof (ret), sizeof (ret));
return ret;
}
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index aefd105f0a..929b91b56c 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -726,6 +726,9 @@ weak_extern (_dl_starting_up)
extern int _dl_starting_up_internal attribute_hidden;
#endif
+/* Random data provided by the kernel. */
+extern void *_dl_random attribute_hidden;
+
/* OS-dependent function to open the zero-fill device. */
extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */
diff --git a/sysdeps/unix/sysv/linux/dl-osinfo.h b/sysdeps/unix/sysv/linux/dl-osinfo.h
index 0738501a56..d796651ff4 100644
--- a/sysdeps/unix/sysv/linux/dl-osinfo.h
+++ b/sysdeps/unix/sysv/linux/dl-osinfo.h
@@ -159,22 +159,20 @@ _dl_discover_osversion (void)
} while (0)
static inline uintptr_t __attribute__ ((always_inline))
-_dl_setup_stack_chk_guard (void)
+_dl_setup_stack_chk_guard (void *dl_random)
{
uintptr_t ret;
-#ifdef ENABLE_STACKGUARD_RANDOMIZE
- int fd = __open ("/dev/urandom", O_RDONLY);
- if (fd >= 0)
- {
- ssize_t reslen = __read (fd, &ret, sizeof (ret));
- __close (fd);
- if (reslen == (ssize_t) sizeof (ret))
- return ret;
- }
-#endif
- ret = 0;
- unsigned char *p = (unsigned char *) &ret;
- p[sizeof (ret) - 1] = 255;
- p[sizeof (ret) - 2] = '\n';
+ /* We need in the moment only 8 bytes on 32-bit platforms and 16
+ bytes on 64-bit platforms. Therefore we can use the data
+ directly and not use the kernel-provided data to seed a PRNG. */
+ memcpy (&ret, dl_random, sizeof (ret));
+ return ret;
+}
+
+static inline uintptr_t __attribute__ ((always_inline))
+_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard)
+{
+ uintptr_t ret;
+ memcpy (&ret, (char *) dl_random + sizeof (ret), sizeof (ret));
return ret;
}

View File

@ -0,0 +1,174 @@
diff --git a/csu/libc-start.c b/csu/libc-start.c
index a14ed71616..8b3f436f46 100644
--- a/csu/libc-start.c
+++ b/csu/libc-start.c
@@ -140,7 +140,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
__pthread_initialize_minimal ();
/* Set up the stack checker's canary. */
- uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard ();
+ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
# ifdef THREAD_SET_STACK_GUARD
THREAD_SET_STACK_GUARD (stack_chk_guard);
# else
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 2c11ac6881..321ed07a18 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -84,6 +84,9 @@ struct r_scope_elem _dl_initial_searchlist;
int _dl_starting_up = 1;
#endif
+/* Random data provided by the kernel. */
+void *_dl_random;
+
/* Get architecture specific initializer. */
#include <dl-procinfo.c>
@@ -216,6 +219,9 @@ _dl_aux_init (ElfW(auxv_t) *av)
__libc_enable_secure = av->a_un.a_val;
__libc_enable_secure_decided = 1;
break;
+ case AT_RANDOM:
+ _dl_random = (void *) av->a_un.a_val;
+ break;
# ifdef DL_PLATFORM_AUXV
DL_PLATFORM_AUXV
# endif
diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c
index 85e331a90f..6ce20b5150 100644
--- a/elf/dl-sysdep.c
+++ b/elf/dl-sysdep.c
@@ -62,6 +62,7 @@ int __libc_multiple_libcs = 0; /* Defining this here avoids the inclusion
void *__libc_stack_end attribute_relro = NULL;
rtld_hidden_data_def(__libc_stack_end)
static ElfW(auxv_t) *_dl_auxv attribute_relro;
+void *_dl_random attribute_relro = NULL;
#ifndef DL_FIND_ARG_COMPONENTS
# define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp) \
@@ -173,6 +174,9 @@ _dl_sysdep_start (void **start_argptr,
GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val;
break;
#endif
+ case AT_RANDOM:
+ _dl_random = (void *) av->a_un.a_val;
+ break;
#ifdef DL_PLATFORM_AUXV
DL_PLATFORM_AUXV
#endif
@@ -293,6 +297,7 @@ _dl_show_auxv (void)
[AT_SECURE - 2] = { "AT_SECURE: ", dec },
[AT_SYSINFO - 2] = { "AT_SYSINFO: 0x", hex },
[AT_SYSINFO_EHDR - 2] = { "AT_SYSINFO_EHDR: 0x", hex },
+ [AT_RANDOM - 2] = { "AT_RANDOM: 0x", hex },
};
unsigned int idx = (unsigned int) (av->a_type - 2);
diff --git a/elf/rtld.c b/elf/rtld.c
index 7612a69324..e77ac43713 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -1816,7 +1816,7 @@ ERROR: ld.so: object '%s' cannot be loaded as audit interface: %s; ignored.\n",
tcbp = init_tls ();
/* Set up the stack checker's canary. */
- uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard ();
+ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
#ifdef THREAD_SET_STACK_GUARD
THREAD_SET_STACK_GUARD (stack_chk_guard);
#else
diff --git a/sysdeps/generic/dl-osinfo.h b/sysdeps/generic/dl-osinfo.h
index 60b84a900d..02ec28d424 100644
--- a/sysdeps/generic/dl-osinfo.h
+++ b/sysdeps/generic/dl-osinfo.h
@@ -1,12 +1,29 @@
#include <stdint.h>
static inline uintptr_t __attribute__ ((always_inline))
-_dl_setup_stack_chk_guard (void)
+_dl_setup_stack_chk_guard (void *dl_random)
{
- uintptr_t ret = 0;
- unsigned char *p = (unsigned char *) &ret;
- p[sizeof (ret) - 1] = 255;
- p[sizeof (ret) - 2] = '\n';
- p[0] = 0;
+ uintptr_t ret;
+ if (dl_random == NULL)
+ {
+ ret = 0;
+ unsigned char *p = (unsigned char *) &ret;
+ p[sizeof (ret) - 1] = 255;
+ p[sizeof (ret) - 2] = '\n';
+ p[0] = 0;
+ }
+ else
+ memcmp (&ret, dl_random, sizeof (ret));
+ return ret;
+}
+
+static inline uintptr_t __attribute__ ((always_inline))
+_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard)
+{
+ uintptr_t ret;
+ if (dl_random == NULL)
+ ret = stack_chk_guard;
+ else
+ memcmp (&ret, (char *) dl_random + sizeof (ret), sizeof (ret));
return ret;
}
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 958a099b82..c4d2874085 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -726,6 +726,9 @@ weak_extern (_dl_starting_up)
extern int _dl_starting_up_internal attribute_hidden;
#endif
+/* Random data provided by the kernel. */
+extern void *_dl_random attribute_hidden;
+
/* OS-dependent function to open the zero-fill device. */
extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */
diff --git a/sysdeps/unix/sysv/linux/dl-osinfo.h b/sysdeps/unix/sysv/linux/dl-osinfo.h
index 082790f63b..d90f228942 100644
--- a/sysdeps/unix/sysv/linux/dl-osinfo.h
+++ b/sysdeps/unix/sysv/linux/dl-osinfo.h
@@ -154,22 +154,20 @@ _dl_discover_osversion (void)
} while (0)
static inline uintptr_t __attribute__ ((always_inline))
-_dl_setup_stack_chk_guard (void)
+_dl_setup_stack_chk_guard (void *dl_random)
{
uintptr_t ret;
-#ifdef ENABLE_STACKGUARD_RANDOMIZE
- int fd = __open ("/dev/urandom", O_RDONLY);
- if (fd >= 0)
- {
- ssize_t reslen = __read (fd, &ret, sizeof (ret));
- __close (fd);
- if (reslen == (ssize_t) sizeof (ret))
- return ret;
- }
-#endif
- ret = 0;
- unsigned char *p = (unsigned char *) &ret;
- p[sizeof (ret) - 1] = 255;
- p[sizeof (ret) - 2] = '\n';
+ /* We need in the moment only 8 bytes on 32-bit platforms and 16
+ bytes on 64-bit platforms. Therefore we can use the data
+ directly and not use the kernel-provided data to seed a PRNG. */
+ memcpy (&ret, dl_random, sizeof (ret));
+ return ret;
+}
+
+static inline uintptr_t __attribute__ ((always_inline))
+_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard)
+{
+ uintptr_t ret;
+ memcpy (&ret, (char *) dl_random + sizeof (ret), sizeof (ret));
return ret;
}

View File

@ -0,0 +1,205 @@
From 965cb60a21674edb8e20b1a2a41297bcd4622361 Mon Sep 17 00:00:00 2001
From: Ulrich Drepper <drepper@redhat.com>
Date: Sun, 11 Jan 2009 04:44:06 +0000
Subject: [PATCH] * sysdeps/generic/dl-osinfo.h (_dl_setup_stack_chk_guard)
diff --git a/elf/dl-support.c b/elf/dl-support.c
index 6bd573ec57..7b3ccf3d4d 100644
--- a/elf/dl-support.c
+++ b/elf/dl-support.c
@@ -84,6 +84,9 @@ struct r_scope_elem _dl_initial_searchlist;
int _dl_starting_up = 1;
#endif
+/* Random data provided by the kernel. */
+void *_dl_random;
+
/* Get architecture specific initializer. */
#include <dl-procinfo.c>
@@ -216,6 +219,9 @@ _dl_aux_init (ElfW(auxv_t) *av)
__libc_enable_secure = av->a_un.a_val;
__libc_enable_secure_decided = 1;
break;
+ case AT_RANDOM:
+ _dl_random = (void *) av->a_un.a_val;
+ break;
# ifdef DL_PLATFORM_AUXV
DL_PLATFORM_AUXV
# endif
diff --git a/elf/dl-sysdep.c b/elf/dl-sysdep.c
index e6f4272a63..29ae895473 100644
--- a/elf/dl-sysdep.c
+++ b/elf/dl-sysdep.c
@@ -62,6 +62,7 @@ int __libc_multiple_libcs = 0; /* Defining this here avoids the inclusion
void *__libc_stack_end attribute_relro = NULL;
rtld_hidden_data_def(__libc_stack_end)
static ElfW(auxv_t) *_dl_auxv attribute_relro;
+void *_dl_random attribute_relro = NULL;
#ifndef DL_FIND_ARG_COMPONENTS
# define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp) \
@@ -173,6 +174,9 @@ _dl_sysdep_start (void **start_argptr,
GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val;
break;
#endif
+ case AT_RANDOM:
+ _dl_random = (void *) av->a_un.a_val;
+ break;
#ifdef DL_PLATFORM_AUXV
DL_PLATFORM_AUXV
#endif
@@ -294,6 +298,7 @@ _dl_show_auxv (void)
[AT_SECURE - 2] = { "AT_SECURE: ", dec },
[AT_SYSINFO - 2] = { "AT_SYSINFO: 0x", hex },
[AT_SYSINFO_EHDR - 2] = { "AT_SYSINFO_EHDR: 0x", hex },
+ [AT_RANDOM - 2] = { "AT_RANDOM: 0x", hex },
};
unsigned int idx = (unsigned int) (av->a_type - 2);
diff --git a/elf/rtld.c b/elf/rtld.c
index 46bece7fa3..60d414d637 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -841,7 +841,7 @@ static void
security_init (void)
{
/* Set up the stack checker's canary. */
- uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard ();
+ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
#ifdef THREAD_SET_STACK_GUARD
THREAD_SET_STACK_GUARD (stack_chk_guard);
#else
@@ -851,18 +851,18 @@ security_init (void)
/* Set up the pointer guard as well, if necessary. */
if (GLRO(dl_pointer_guard))
{
- // XXX If it is cheap, we should use a separate value.
- uintptr_t pointer_chk_guard = stack_chk_guard;
-#ifndef HP_TIMING_NONAVAIL
- hp_timing_t now;
- HP_TIMING_NOW (now);
- pointer_chk_guard ^= now;
-#endif
+ uintptr_t pointer_chk_guard = _dl_setup_pointer_guard (_dl_random,
+ stack_chk_guard);
#ifdef THREAD_SET_POINTER_GUARD
THREAD_SET_POINTER_GUARD (pointer_chk_guard);
#endif
__pointer_chk_guard_local = pointer_chk_guard;
}
+
+ /* We do not need the _dl_random value anymore. The less
+ information we leave behind, the better, so clear the
+ variable. */
+ _dl_random = NULL;
}
diff --git a/sysdeps/generic/dl-osinfo.h b/sysdeps/generic/dl-osinfo.h
index 60b84a900d..02ec28d424 100644
--- a/sysdeps/generic/dl-osinfo.h
+++ b/sysdeps/generic/dl-osinfo.h
@@ -1,12 +1,29 @@
#include <stdint.h>
static inline uintptr_t __attribute__ ((always_inline))
-_dl_setup_stack_chk_guard (void)
+_dl_setup_stack_chk_guard (void *dl_random)
{
- uintptr_t ret = 0;
- unsigned char *p = (unsigned char *) &ret;
- p[sizeof (ret) - 1] = 255;
- p[sizeof (ret) - 2] = '\n';
- p[0] = 0;
+ uintptr_t ret;
+ if (dl_random == NULL)
+ {
+ ret = 0;
+ unsigned char *p = (unsigned char *) &ret;
+ p[sizeof (ret) - 1] = 255;
+ p[sizeof (ret) - 2] = '\n';
+ p[0] = 0;
+ }
+ else
+ memcmp (&ret, dl_random, sizeof (ret));
+ return ret;
+}
+
+static inline uintptr_t __attribute__ ((always_inline))
+_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard)
+{
+ uintptr_t ret;
+ if (dl_random == NULL)
+ ret = stack_chk_guard;
+ else
+ memcmp (&ret, (char *) dl_random + sizeof (ret), sizeof (ret));
return ret;
}
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 4d857404a3..f5606f373f 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -731,6 +731,9 @@ weak_extern (_dl_starting_up)
extern int _dl_starting_up_internal attribute_hidden;
#endif
+/* Random data provided by the kernel. */
+extern void *_dl_random attribute_hidden;
+
/* OS-dependent function to open the zero-fill device. */
extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */
diff --git a/sysdeps/unix/sysv/linux/dl-osinfo.h b/sysdeps/unix/sysv/linux/dl-osinfo.h
index 5271d4e4de..ee8eaf20e4 100644
--- a/sysdeps/unix/sysv/linux/dl-osinfo.h
+++ b/sysdeps/unix/sysv/linux/dl-osinfo.h
@@ -60,22 +60,20 @@ dl_fatal (const char *str)
} while (0)
static inline uintptr_t __attribute__ ((always_inline))
-_dl_setup_stack_chk_guard (void)
+_dl_setup_stack_chk_guard (void *dl_random)
{
uintptr_t ret;
-#ifdef ENABLE_STACKGUARD_RANDOMIZE
- int fd = __open ("/dev/urandom", O_RDONLY);
- if (fd >= 0)
- {
- ssize_t reslen = __read (fd, &ret, sizeof (ret));
- __close (fd);
- if (reslen == (ssize_t) sizeof (ret))
- return ret;
- }
-#endif
- ret = 0;
- unsigned char *p = (unsigned char *) &ret;
- p[sizeof (ret) - 1] = 255;
- p[sizeof (ret) - 2] = '\n';
+ /* We need in the moment only 8 bytes on 32-bit platforms and 16
+ bytes on 64-bit platforms. Therefore we can use the data
+ directly and not use the kernel-provided data to seed a PRNG. */
+ memcpy (&ret, dl_random, sizeof (ret));
+ return ret;
+}
+
+static inline uintptr_t __attribute__ ((always_inline))
+_dl_setup_pointer_guard (void *dl_random, uintptr_t stack_chk_guard)
+{
+ uintptr_t ret;
+ memcpy (&ret, (char *) dl_random + sizeof (ret), sizeof (ret));
return ret;
}
diff --git a/csu/libc-start.c b/csu/libc-start.c
index a14ed71616a..80b672f88d8 100644
--- a/csu/libc-start.c
+++ b/csu/libc-start.c
@@ -140,7 +140,7 @@ LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
__pthread_initialize_minimal ();
/* Set up the stack checker's canary. */
- uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard ();
+ uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
# ifdef THREAD_SET_STACK_GUARD
THREAD_SET_STACK_GUARD (stack_chk_guard);
# else

View File

@ -57,11 +57,6 @@ class Glibc(AutotoolsPackage, GNUMirrorPackage):
version("2.6.1", sha256="6be7639ccad715d25eef560ce9d1637ef206fb9a162714f6ab8167fc0d971cae")
version("2.5", sha256="16d3ac4e86eed75d85d80f1f214a6bd58d27f13590966b5ad0cc181df85a3493")
# Spack commit 29aa7117f42f758bc537e03e4bedf66ced0accfa has older versions
# of glibc, but they are removed, because glibc < 2.17 links against
# libgcc_s and libgcc_eh, see glibc commit "Avoid use of libgcc_s and
# libgcc_eh when building glibc." 95f5a9a866695da4e038aa4e6ccbbfd5d9cf63b7
# Fix for newer GCC, related to -fno-common
patch("locs.patch", when="@2.23:2.25")
patch("locs-2.22.patch", when="@:2.22")
@ -75,6 +70,13 @@ class Glibc(AutotoolsPackage, GNUMirrorPackage):
# rpc/types.h include issue, should be from local version, not system.
patch("fb21f89.patch", when="@:2.16")
# Avoid linking libgcc_eh
patch("95f5a9a-stub.patch", when="@:2.16")
patch("95f5a9a-2.16.patch", when="@2.16")
patch("95f5a9a-2.15.patch", when="@2.14:2.15")
patch("95f5a9a-2.13.patch", when="@2.12:2.13")
patch("95f5a9a-2.11.patch", when="@:2.11")
# Use init_array (modified commit 4a531bb to unconditionally define
# NO_CTORS_DTORS_SECTIONS)
patch("4a531bb.patch", when="@:2.12")
@ -85,6 +87,14 @@ class Glibc(AutotoolsPackage, GNUMirrorPackage):
# linker flag output regex
patch("7c8a673.patch", when="@:2.9")
# Use AT_RANDOM provided by the kernel instead of /dev/urandom;
# recent gcc + binutils have issues with the inline assembly in
# the fallback code, so better to use the kernel-provided value.
patch("965cb60.patch", when="@2.8:2.9")
patch("965cb60-2.7.patch", when="@2.7")
patch("965cb60-2.6.patch", when="@2.6")
patch("965cb60-2.5.patch", when="@2.5")
# include_next <limits.h> not working
patch("67fbfa5.patch", when="@:2.7")
@ -95,6 +105,12 @@ def setup_build_environment(self, env):
# for some reason CPPFLAGS -U_FORTIFY_SOURCE is not enough, it has to be CFLAGS
env.append_flags("CPPFLAGS", "-U_FORTIFY_SOURCE")
env.append_flags("CFLAGS", "-O2 -g -fno-stack-protector -U_FORTIFY_SOURCE")
if self.spec.satisfies("@:2.9"):
# missing defines in elf.h after 965cb60.patch
env.append_flags("CFLAGS", "-DAT_BASE_PLATFORM=24 -DAT_RANDOM=25")
if self.spec.satisfies("@:2.6"):
# change of defaults in gcc 10
env.append_flags("CFLAGS", "-fcommon")
if self.spec.satisfies("@2.5"):
env.append_flags("CFLAGS", "-fgnu89-inline")

View File

@ -16,6 +16,9 @@ class GmapGsnap(AutotoolsPackage):
maintainers("snehring")
version(
"2023-07-20", sha256="19e70eebd9b282d8596721812d071efed188b6d5000627b9948f0486f87fe68f"
)
version(
"2023-06-01", sha256="c7e6f6cf644e6f66f9f5a0811a49da8cc81f095a4bd7b7cef2ab10aa5b314430"
)
@ -60,12 +63,18 @@ class GmapGsnap(AutotoolsPackage):
depends_on("bzip2")
depends_on("perl", type="run")
requires("simd=arm", when="target=aarch64", msg="simd=arm is required when building on arm")
variant(
"simd",
description="CPU support.",
values=("avx2", "sse42", "avx512", "sse2"),
values=(
conditional("avx2", "sse42", "avx512", "sse2", when="target=x86_64:"),
conditional("arm", when="@2023-02-17: target=aarch64:"),
conditional("avx512", "avx512bw", when="@2023-03-24: target=x86_64:"),
),
multi=True,
default="sse2",
default="avx2",
)
def configure(self, spec, prefix):

View File

@ -0,0 +1,46 @@
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack.package import *
class Gsibec(CMakePackage):
"""GSIbec: Extracts the background error covariance (BEC) model
capabilities from the Gridpoint Statistical Interpolation (GSI)
atmospheric analysis system into a library of its own."""
homepage = "https://github.com/GEOS-ESM/gsibec"
git = "https://github.com/GEOS-ESM/gsibec.git"
url = "https://github.com/GEOS-ESM/gsibec/archive/refs/tags/1.0.2.tar.gz"
maintainers("mathomp4", "danholdaway")
version("develop", branch="develop")
version("1.1.3", sha256="9cac000562250487c16608e8245d97457cc1663b1793b3833be5a76ebccb4b47")
version("1.1.2", sha256="8bdcdf1663e6071b6ad9e893a76307abc70a6de744fb75a13986e70242993ada")
version("1.0.7", sha256="53912f1f19d46f4941b377803cc2fce89a2b50d2ece7562f8fd65215a8908158")
version("1.0.6", sha256="10e2561685156bcfba35c7799732c77f9c05bd180888506a339540777db833dd")
version("1.0.5", sha256="ac0cecc59e38da7eefb5a8f27975b33752fa61a4abd3bdbbfb55578ea59d95b3")
version("1.0.4", sha256="6460e221f2a45640adab016336c070fbe3e7c4b6fc55257945bf5cdb38d5d3e2")
version("1.0.3", sha256="f104daf55705c5093a3d984073f082017bc9166f51ded36c7f7bb8adf233c916")
version("1.0.2", sha256="7dc02f1f499e0d9f2843440f517d6c8e5d10ea084cbb2567ec198ba06816bc8b")
depends_on("mpi", type=("build", "run"))
depends_on("netcdf-c +mpi", type=("build", "run"))
depends_on("netcdf-fortran", type=("build", "run"))
depends_on("lapack", type=("build", "run"))
depends_on("ecbuild", type=("build"))
depends_on("jedi-cmake", type=("build"))
depends_on("sp", type=("build"))
def cmake_args(self):
args = []
mkl_providers = ["intel-mkl", "intel-oneapi-mkl", "intel-parallel-studio"]
args.append(self.define("ENABLE_MKL", spec["lapack"].name in mkl_providers))
return args

View File

@ -76,6 +76,7 @@ class Hypre(AutotoolsPackage, CudaPackage, ROCmPackage):
variant("gptune", default=False, description="Add the GPTune hookup code")
variant("umpire", default=False, description="Enable Umpire support")
variant("sycl", default=False, description="Enable SYCL support")
variant("magma", default=False, description="Enable MAGMA interface")
variant("caliper", default=False, description="Enable Caliper support")
# Patch to add gptune hookup codes
@ -100,6 +101,7 @@ def patch(self): # fix sequential compilation in 'src/seq_mv'
depends_on("mpi", when="+mpi")
depends_on("blas")
depends_on("lapack")
depends_on("magma", when="+magma")
depends_on("superlu-dist", when="+superlu-dist+mpi")
depends_on("rocsparse", when="+rocm")
depends_on("rocthrust", when="+rocm")
@ -108,18 +110,23 @@ def patch(self): # fix sequential compilation in 'src/seq_mv'
depends_on("umpire", when="+umpire")
depends_on("caliper", when="+caliper")
gpu_pkgs = ["magma", "umpire"]
for sm_ in CudaPackage.cuda_arch_values:
depends_on(
"umpire+cuda cuda_arch={0}".format(sm_), when="+umpire+cuda cuda_arch={0}".format(sm_)
)
for gfx in ROCmPackage.amdgpu_targets:
depends_on(
"umpire+rocm amdgpu_target={0}".format(gfx),
when="+umpire+rocm amdgpu_target={0}".format(gfx),
)
for pkg in gpu_pkgs:
depends_on(
"{0}+cuda cuda_arch={1}".format(pkg, sm_),
when="+{0}+cuda cuda_arch={1}".format(pkg, sm_),
)
# Uses deprecated cuSPARSE functions/types (e.g. csrsv2Info_t).
depends_on("cuda@:11", when="+cuda")
for gfx in ROCmPackage.amdgpu_targets:
for pkg in gpu_pkgs:
depends_on(
"{0}+rocm amdgpu_target={1}".format(pkg, gfx),
when="+{0}+rocm amdgpu_target={1}".format(pkg, gfx),
)
# hypre@:2.28.0 uses deprecated cuSPARSE functions/types (e.g. csrsv2Info_t).
depends_on("cuda@:11", when="@:2.28.0+cuda")
# Conflicts
conflicts("+cuda", when="+int64")
@ -150,6 +157,9 @@ def patch(self): # fix sequential compilation in 'src/seq_mv'
# Option added in v2.24.0
conflicts("+sycl", when="@:2.23")
# Option added in v2.29.0
conflicts("+magma", when="@:2.28")
configure_directory = "src"
def url_for_version(self, version):
@ -280,6 +290,11 @@ def configure_args(self):
if "+unified-memory" in spec:
configure_args.append("--enable-unified-memory")
if "+magma" in spec:
configure_args.append("--with-magma-include=%s" % spec["magma"].prefix.include)
configure_args.append("--with-magma-lib=%s" % spec["magma"].libs)
configure_args.append("--with-magma")
configure_args.extend(self.enable_or_disable("fortran"))
return configure_args
@ -329,7 +344,7 @@ def install(self, spec, prefix):
@run_after("install")
def cache_test_sources(self):
self.cache_extra_test_sources(self.extra_install_tests)
cache_extra_test_sources(self, self.extra_install_tests)
@property
def _cached_tests_work_dir(self):

View File

@ -111,6 +111,13 @@ class IntelOneapiMpi(IntelOneApiLibraryPackage):
def component_dir(self):
return "mpi"
@property
def env_script_args(self):
if "+external-libfabric" in self.spec:
return ("-i_mpi_ofi_internal=0",)
else:
return ()
def setup_dependent_package(self, module, dep_spec):
if "+generic-names" in self.spec:
self.spec.mpicc = join_path(self.component_prefix.bin, "mpicc")

View File

@ -0,0 +1,24 @@
# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack.package import *
class JediCmake(CMakePackage):
"""CMake/ecbuild toolchains to facilitate portability on different systems."""
homepage = "https://github.com/JCSDA/jedi-cmake"
git = "https://github.com/JCSDA/jedi-cmake.git"
maintainers("climbfuji")
version("master", branch="master", no_cache=True)
version("develop", branch="develop", no_cache=True)
version(
"1.4.0", commit="36fc99bdff5d3d8835480b37a3dcc75e5f8da256", preferred=True, submodules=True
)
version("1.3.0", commit="729a9b2ec97a7e93cbc58213493f28ca11f08754")
depends_on("cmake @3.10:", type=("build"))

View File

@ -24,12 +24,14 @@ class Kealib(CMakePackage):
"""
homepage = "http://www.kealib.org/"
url = "https://github.com/ubarsc/kealib/releases/download/kealib-1.5.0/kealib-1.5.0.tar.gz"
url = "https://github.com/ubarsc/kealib/releases/download/kealib-1.5.2/kealib-1.5.2.tar.gz"
git = "https://github.com/ubarsc/kealib"
maintainers("gillins", "neilflood", "petebunting")
version("develop", git=git)
version("1.5.2", sha256="c4e17c472761a39e45184b5fa687395b319ac75430e0f6584dbf4cec6e335572")
version("1.5.1", sha256="06cd547b1e40394b9539beaf6982bd249e8ee93d6150295e9cd9161d00829657")
version("1.5.0", sha256="d19a0fb051019f87fe413bda76472bf4fff8fca52ede92e0ffd983caeafd05b8")
version("1.4.15", sha256="40f2573c00f005f93c1fa88f1f13bfbd485cbc7a9b3f1c706931e69bff17dae4")
version("1.4.12", sha256="0b100e36b3e25e57487aa197d7be47f22e1b30afb16a57fdaa5f877696ec321e")
@ -39,8 +41,9 @@ class Kealib(CMakePackage):
version("1.4.8", sha256="0f24d8478865abcb17865c8f49c0370095726c529b8ac373ffae018ad3d40a02")
version("1.4.7", sha256="ec38751b3b555d3a26f0c7445f2d2cd9d7c3a3502237519a206a50cb58df56ec")
depends_on("cmake@2.8.10:", type="build")
depends_on("hdf5+cxx+hl")
depends_on("cmake@3.5:", type="build")
depends_on("hdf5+cxx+hl", when="@:1.5.1")
depends_on("hdf5+cxx", when="@1.5.2:")
patch("cmake.patch", when="@1.4.7")

View File

@ -16,10 +16,15 @@ class Last(MakefilePackage):
git = "https://gitlab.com/mcfrith/last.git"
maintainers("snehring")
version("1499", commit="2cc68d3ba8ae5ca46ceeb69302aef18b9db04f46")
version("1282", commit="4368be912f4759e52b549940276f1adf087f489a")
version("869", sha256="6371a6282bc1bb02a5e5013cc463625f2ce3e7746ff2ea0bdf9fe6b15605a67c")
depends_on("zlib-api")
def edit(self, spec, prefix):
if not spec.satisfies("target=x86_64:"):
filter_file("-msse4", "", "makefile")
files = ["mat-doc.sh", "mat-inc.sh", "seed-doc.sh", "seed-inc.sh"]
if spec.satisfies("@1282:"):
files.append("gc-inc.sh")

View File

@ -16,14 +16,15 @@ class Libressl(AutotoolsPackage):
maintainers("eschnett")
version("3.7.2", sha256="b06aa538fefc9c6b33c4db4931a09a5f52d9d2357219afcbff7d93fe12ebf6f7")
version("3.6.3", sha256="87b1bbe36e9eec8d0ae5f04c83d36b2c5b0e581784c7eb0817025ed29eadea37")
version("3.6.1", sha256="acfac61316e93b919c28d62d53037ca734de85c46b4d703f19fd8395cf006774")
variant("shared", default=True, description="Build shared libraries")
variant("static", default=False, description="Build static libraries")
def configure_args(self):
args = [
"--enable-shared" if "+shared" in spec else "--disable-shared",
"--enable-static" if "+static" in spec else "--disable-static",
]
args = []
args.extend(self.enable_or_disable("shared"))
args.extend(self.enable_or_disable("static"))
return args

View File

@ -27,6 +27,16 @@ class Mash(AutotoolsPackage):
depends_on("capnproto")
depends_on("gsl")
def patch(self):
if self.spec.satisfies("target=aarch64:"):
filter_file(
"CXXFLAGS += -include src/mash/memcpyLink.h -Wl,--wrap=memcpy",
"",
"Makefile.in",
string=True,
)
filter_file("CFLAGS += -include src/mash/memcpyLink.h", "", "Makefile.in", string=True)
def configure_args(self):
args = []
args.append("--with-capnp=" + self.spec["capnproto"].prefix)

View File

@ -17,7 +17,8 @@ class Nccl(MakefilePackage, CudaPackage):
maintainers("adamjstewart")
libraries = ["libnccl.so"]
version("2.18.3-1", sha256="b4f5d7d9eea2c12e32e7a06fe138b2cfc75969c6d5c473aa6f819a792db2fc96")
version("2.18.5-1", sha256="16ac98f3e926c024ce48e10ab220e19ce734adc48c423cfd55ad6f509bd1179f")
version("2.18.3-1", sha256="6477d83c9edbb34a0ebce6d751a1b32962bc6415d75d04972b676c6894ceaef9")
version("2.18.1-1", sha256="0e4ede5cf8df009bff5aeb3a9f194852c03299ae5664b5a425b43358e7a9eef2")
version("2.17.1-1", sha256="1311a6fd7cd44ad6d4523ba03065ce694605843fd30a5c0f77aa3d911abe706d")
version("2.16.2-1", sha256="7f7c738511a8876403fc574d13d48e7c250d934d755598d82e14bab12236fc64")

View File

@ -19,6 +19,11 @@ class OmegaH(CMakePackage, CudaPackage):
maintainers("cwsmith")
tags = ["e4s"]
version("main", branch="main")
version(
"scorec.10.7.0",
commit="0e5de8618c3370f702e08c1b1af476dbbc118892",
git="https://github.com/SCOREC/omega_h.git",
)
version(
"scorec.10.6.0",
commit="f376fad4741b55a4b2482218eb3437d719b7c72e",

View File

@ -0,0 +1,13 @@
diff -ruN spack-src/cmake/fc.cmake spack-src-new/cmake/fc.cmake
--- spack-src/cmake/fc.cmake 2023-04-01 14:18:01.000000000 -0600
+++ spack-src-new/cmake/fc.cmake 2023-06-06 09:34:12.921982500 -0600
@@ -89,6 +89,9 @@
if (${F_COMPILER} STREQUAL "INTEL")
set(CCOMMON_OPT "${CCOMMON_OPT} -DF_INTERFACE_INTEL")
+ if (MSVC)
+ set(FCOMMON_OPT "${FCOMMON_OPT} -names:uppercase -assume:underscore")
+ endif ()
if (INTERFACE64)
set(FCOMMON_OPT "${FCOMMON_OPT} -i8")
endif ()

View File

@ -6,11 +6,13 @@
import os
import re
import spack.build_systems.cmake
import spack.build_systems.makefile
from spack.package import *
from spack.package_test import compare_output_file, compile_c_and_execute
class Openblas(MakefilePackage):
class Openblas(CMakePackage, MakefilePackage):
"""OpenBLAS: An optimized BLAS library"""
homepage = "https://www.openblas.net"
@ -19,7 +21,7 @@ class Openblas(MakefilePackage):
)
git = "https://github.com/OpenMathLib/OpenBLAS.git"
libraries = ["libopenblas"]
libraries = ["libopenblas", "openblas"]
version("develop", branch="develop")
version("0.3.24", sha256="ceadc5065da97bd92404cac7254da66cc6eb192679cf1002098688978d4d5132")
@ -91,6 +93,9 @@ class Openblas(MakefilePackage):
provides("lapack@3.9.1:", when="@0.3.15:")
provides("lapack@3.7.0", when="@0.2.20")
# https://github.com/xianyi/OpenBLAS/pull/2519/files
patch("ifort-msvc.patch", when="%msvc")
# https://github.com/OpenMathLib/OpenBLAS/pull/3712
patch("cce.patch", when="@0.3.20 %cce")
@ -213,6 +218,8 @@ class Openblas(MakefilePackage):
depends_on("perl", type="build")
build_system("makefile", "cmake", default="makefile")
def flag_handler(self, name, flags):
spec = self.spec
iflags = []
@ -242,13 +249,37 @@ def check_compilers(self):
# require both.
# As of 08/2022 (0.3.21), we can build purely with a C compiler using
# a f2c translated LAPACK version
# https://github.com/OpenMathLib/OpenBLAS/releases/tag/v0.3.21
# https://github.com/xianyi/OpenBLAS/releases/tag/v0.3.21
if self.compiler.fc is None and "~fortran" not in self.spec:
raise InstallError(
self.compiler.cc
+ " has no Fortran compiler added in spack. Add it or use openblas~fortran!"
)
@property
def headers(self):
# The only public headers for cblas and lapacke in
# openblas are cblas.h and lapacke.h. The remaining headers are private
# headers either included in one of these two headers, or included in
# one of the source files implementing functions declared in these
# headers.
return find_headers(["cblas", "lapacke"], self.prefix.include)
@property
def libs(self):
spec = self.spec
# Look for openblas{symbol_suffix}
name = ["libopenblas", "openblas"]
search_shared = bool(spec.variants["shared"].value)
suffix = spec.variants["symbol_suffix"].value
if suffix != "none":
name += suffix
return find_libraries(name, spec.prefix, shared=search_shared, recursive=True)
class MakefileBuilder(spack.build_systems.makefile.MakefileBuilder):
@staticmethod
def _read_targets(target_file):
"""Parse a list of available targets from the OpenBLAS/TargetList.txt
@ -304,7 +335,7 @@ def _microarch_target_args(self):
if microarch.name in available_targets:
break
if self.version >= Version("0.3"):
if self.spec.version >= Version("0.3"):
# 'ARCH' argument causes build errors in older OpenBLAS
# see https://github.com/spack/spack/issues/15385
arch_name = microarch.family.name
@ -379,9 +410,9 @@ def make_defs(self):
if "~shared" in self.spec:
if "+pic" in self.spec:
make_defs.append("CFLAGS={0}".format(self.compiler.cc_pic_flag))
make_defs.append("CFLAGS={0}".format(self.pkg.compiler.cc_pic_flag))
if "~fortran" not in self.spec:
make_defs.append("FFLAGS={0}".format(self.compiler.f77_pic_flag))
make_defs.append("FFLAGS={0}".format(self.pkg.compiler.f77_pic_flag))
make_defs += ["NO_SHARED=1"]
# fix missing _dggsvd_ and _sggsvd_
if self.spec.satisfies("@0.2.16"):
@ -442,28 +473,6 @@ def make_defs(self):
return make_defs
@property
def headers(self):
# As in netlib-lapack, the only public headers for cblas and lapacke in
# openblas are cblas.h and lapacke.h. The remaining headers are private
# headers either included in one of these two headers, or included in
# one of the source files implementing functions declared in these
# headers.
return find_headers(["cblas", "lapacke"], self.prefix.include)
@property
def libs(self):
spec = self.spec
# Look for openblas{symbol_suffix}
name = "libopenblas"
search_shared = bool(spec.variants["shared"].value)
suffix = spec.variants["symbol_suffix"].value
if suffix != "none":
name += suffix
return find_libraries(name, spec.prefix, shared=search_shared, recursive=True)
@property
def build_targets(self):
return ["-s"] + self.make_defs + ["all"]
@ -499,3 +508,28 @@ def check_install(self):
output = compile_c_and_execute(source_file, [include_flags], link_flags.split())
compare_output_file(output, blessed_file)
class CMakeBuilder(spack.build_systems.cmake.CMakeBuilder):
def cmake_args(self):
cmake_defs = [self.define("TARGET", "GENERIC")]
if self.spec.satisfies("platform=windows"):
cmake_defs += [
self.define("DYNAMIC_ARCH", "OFF"),
self.define("BUILD_WITHOUT_LAPACK", "ON"),
]
if "~fortran" in self.spec:
cmake_defs += [self.define("NOFORTRAN", "ON")]
if "+shared" in self.spec:
cmake_defs += [self.define("BUILD_SHARED_LIBS", "ON")]
if self.spec.satisfies("threads=openmp"):
cmake_defs += [self.define("USE_OPENMP", "ON"), self.define("USE_THREAD", "ON")]
elif self.spec.satisfies("threads=pthreads"):
cmake_defs += [self.define("USE_OPENMP", "OFF"), self.define("USE_THREAD", "ON")]
else:
cmake_defs += [self.define("USE_OPENMP", "OFF"), self.define("USE_THREAD", "OFF")]
return cmake_defs

View File

@ -19,6 +19,8 @@ class Opencv(CMakePackage, CudaPackage):
maintainers("bvanessen", "adamjstewart")
version("master", branch="master")
version("4.8.0", sha256="cbf47ecc336d2bff36b0dcd7d6c179a9bb59e805136af6b9670ca944aef889bd")
version("4.7.0", sha256="8df0079cdbe179748a18d44731af62a245a45ebf5085223dc03133954c662973")
version("4.6.0", sha256="1ec1cba65f9f20fe5a41fda1586e01c70ea0c9a6d7b67c9e13edf0cfe2239277")
version("4.5.5", sha256="a1cfdcf6619387ca9e232687504da996aaa9f7b5689986b8331ec02cb61d28ad")
version("4.5.4", sha256="c20bb83dd790fc69df9f105477e24267706715a9d3c705ca1e7f613c7b3bad3d")
@ -63,6 +65,8 @@ class Opencv(CMakePackage, CudaPackage):
"4.5.4",
"4.5.5",
"4.6.0",
"4.7.0",
"4.8.0",
]
for cv in contrib_vers:
resource(
@ -691,6 +695,7 @@ class Opencv(CMakePackage, CudaPackage):
"mfx",
"ngraph",
"nvcuvid", # disabled, details: https://github.com/opencv/opencv/issues/14850
"nvcuvenc", # disabled, depends on nvcuvid being enabled
"opencl_svm",
"openclamdblas",
"openclamdfft",
@ -740,8 +745,9 @@ class Opencv(CMakePackage, CudaPackage):
depends_on("cudnn@:7.3", when="@3.3.1:3.4+cudnn")
depends_on("cudnn@:6", when="@:3.3.0+cudnn")
depends_on("eigen", when="+eigen")
depends_on("ffmpeg+avresample", when="+ffmpeg")
depends_on("ffmpeg@:4+avresample", when="@:4.5+ffmpeg")
depends_on("ffmpeg", when="+ffmpeg")
depends_on("ffmpeg@:5", when="@:4.7+ffmpeg")
depends_on("ffmpeg@:4+avresample", when="@:4.6+ffmpeg")
depends_on("gdal", when="+gdal")
depends_on("gtkplus", when="+gtk")
depends_on("hpx", when="+hpx")

View File

@ -30,9 +30,14 @@ class Openssl(Package): # Uses Fake Autotools, should subclass Package
executables = ["openssl"]
version("3.1.2", sha256="a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539")
version("3.0.10", sha256="1761d4f5b13a1028b9b6f3d4b8e17feb0cedc9370f6afe61d7193d2cdce83323")
version("3.1.3", sha256="f0316a2ebd89e7f2352976445458689f80302093788c466692fb2a188b2eacf6")
version("3.0.11", sha256="b3425d3bb4a2218d0697eb41f7fc0cdede016ed19ca49d168b78e8d947887f55")
version(
"3.1.2",
sha256="a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539",
deprecated=True,
)
version(
"3.1.1",
sha256="b3aa61334233b852b63ddb048df181177c2c659eb9d4376008118f9c08d07674",
@ -43,6 +48,11 @@ class Openssl(Package): # Uses Fake Autotools, should subclass Package
sha256="aaa925ad9828745c4cad9d9efeb273deca820f2cdcf2c3ac7d7c1212b7c497b4",
deprecated=True,
)
version(
"3.0.10",
sha256="1761d4f5b13a1028b9b6f3d4b8e17feb0cedc9370f6afe61d7193d2cdce83323",
deprecated=True,
)
version(
"3.0.9",
sha256="eb1ab04781474360f77c318ab89d8c5a03abc38e63d65a603cabbf1b00a1dc90",
@ -83,6 +93,11 @@ class Openssl(Package): # Uses Fake Autotools, should subclass Package
sha256="59eedfcb46c25214c9bd37ed6078297b4df01d012267fe9e9eee31f61bc70536",
deprecated=True,
)
version(
"1.1.1w",
sha256="cf3098950cb4d853ad95c0841f1f9c6d3dc102dccfcacd521d93925208b76ac8",
deprecated=True,
)
version(
"1.1.1v",
sha256="d6697e2871e77238460402e9362d47d18382b15ef9f246aba6c7bd780d38a6b0",

View File

@ -1,8 +1,9 @@
Submodule VTK contains modified content
diff --git a/VTK/CMake/FindFreetype.cmake b/VTK/CMake/FindFreetype.cmake
index b4532735c2..f06d32327e 100644
index b4532735c2..51671d4c3c 100644
--- a/VTK/CMake/FindFreetype.cmake
+++ b/VTK/CMake/FindFreetype.cmake
@@ -63,6 +63,30 @@ directory of a Freetype installation.
@@ -63,6 +63,32 @@ directory of a Freetype installation.
# I'm going to attempt to cut out the middleman and hope
# everything still works.
@ -14,6 +15,8 @@ index b4532735c2..f06d32327e 100644
+ get_target_property(freetype_location freetype LOCATION)
+ if (freetype_library_type STREQUAL STATIC_LIBRARY)
+ set(freetype_library_type STATIC)
+ elseif (freetype_library_type STREQUAL SHARED_LIBRARY)
+ set(freetype_library_type SHARED)
+ endif()
+ get_target_property(freetype_interface_include_directories freetype INTERFACE_INCLUDE_DIRECTORIES)
+ get_target_property(freetype_interface_link_libraries freetype INTERFACE_LINK_LIBRARIES)

View File

@ -29,10 +29,11 @@ class Paraview(CMakePackage, CudaPackage, ROCmPackage):
version("master", branch="master", submodules=True)
version(
"5.11.1",
sha256="5cc2209f7fa37cd3155d199ff6c3590620c12ca4da732ef7698dec37fa8dbb34",
"5.11.2",
sha256="5c5d2f922f30d91feefc43b4a729015dbb1459f54c938896c123d2ac289c7a1e",
preferred=True,
)
version("5.11.1", sha256="5cc2209f7fa37cd3155d199ff6c3590620c12ca4da732ef7698dec37fa8dbb34")
version("5.11.0", sha256="9a0b8fe8b1a2cdfd0ace9a87fa87e0ec21ee0f6f0bcb1fdde050f4f585a25165")
version("5.10.1", sha256="520e3cdfba4f8592be477314c2f6c37ec73fb1d5b25ac30bdbd1c5214758b9c2")
version("5.10.0", sha256="86d85fcbec395cdbc8e1301208d7c76d8f48b15dc6b967ffbbaeee31242343a5")

View File

@ -3,10 +3,12 @@
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import spack.build_systems.autotools
import spack.build_systems.cmake
from spack.package import *
class Pcre(AutotoolsPackage):
class Pcre(AutotoolsPackage, CMakePackage):
"""The PCRE package contains Perl Compatible Regular Expression
libraries. These are useful for implementing regular expression
pattern matching using the same syntax and semantics as Perl 5."""
@ -26,6 +28,8 @@ class Pcre(AutotoolsPackage):
maintainers("drkennetz")
patch("intel.patch", when="@8.38")
build_system("autotools", "cmake", default="autotools")
variant("jit", default=False, description="Enable JIT support.")
variant("multibyte", default=True, description="Enable support for 16 and 32 bit characters.")
@ -36,6 +40,8 @@ class Pcre(AutotoolsPackage):
description="Enable support for UTF-8/16/32, " "incompatible with EBCDIC.",
)
class AutotoolsBuilder(spack.build_systems.autotools.AutotoolsBuilder):
def configure_args(self):
args = []
@ -51,3 +57,21 @@ def configure_args(self):
args.append("--enable-unicode-properties")
return args
class CMakeBuilder(spack.build_systems.cmake.CMakeBuilder):
def cmake_args(self):
args = []
if "+jit" in self.spec:
args.append("-DPCRE_SUPPORT_JIT:BOOL=ON")
if "+multibyte" in self.spec:
args.append("-DPCRE_BUILD_PCRE16:BOOL=ON")
args.append("-DPCRE_BUILD_PCRE32:BOOL=ON")
if "+utf" in self.spec:
args.append("-DPCRE_SUPPORT_UTF:BOOL=ON")
args.append("-DPCRE_SUPPORT_UNICODE_PROPERTIES:BOOL=ON")
return args

View File

@ -0,0 +1,41 @@
# Copyright 2013-2023 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack.package import *
class Ploticus(MakefilePackage):
"""Ploticus can produce various types of plots and graphs."""
homepage = "http://ploticus.sourceforge.net/doc/welcome.html"
maintainers("Christoph-TU")
version("2.42", sha256="3f29e4b9f405203a93efec900e5816d9e1b4381821881e241c08cab7dd66e0b0")
depends_on("zlib-api")
depends_on("libpng")
build_directory = "src"
def url_for_version(self, version):
# spack's default url_for_version may replace "242_src" with 2.42_src, causing a 404.
# Returning the correct url here instead of as 'url =' fixes this issue:
return (
"https://sourceforge.net/projects/ploticus/files/ploticus/2.42/ploticus242_src.tar.gz"
)
def setup_run_environment(self, env):
env.set("PLOTICUS_PREFABS", self.prefix.prefabs)
def edit(self, spec, prefix):
makefile = FileFilter("src/Makefile")
makefile.filter("CC = .*", "CC = {0}".format(spack_cc))
def install(self, spec, prefix):
mkdir(prefix.bin)
mkdir(prefix.prefabs)
install("src/pl", prefix.bin)
install_tree("prefabs", prefix.prefabs)

View File

@ -23,6 +23,15 @@ class PyNanobind(PythonPackage):
maintainers("ma595")
version("master", branch="master", submodules=True)
version(
"1.5.2", tag="v1.5.2", commit="b0e24d5b0ab0d518317d6b263a257ae72d4d29a2", submodules=True
)
version(
"1.5.1", tag="v1.5.1", commit="ec6168d06dbf2ab94c31858223bd1d7617222706", submodules=True
)
version(
"1.5.0", tag="v1.5.0", commit="e85a51049db500383808aaa4a77306ff37d96131", submodules=True
)
version(
"1.4.0", tag="v1.4.0", commit="05cba0ef85ba2bb68aa115af4b74c30aa2aa7bec", submodules=True
)

View File

@ -282,8 +282,8 @@ class Python(Package):
patch("tkinter-3.10.patch", when="@3.10.0:3.10 ~tkinter")
patch("tkinter-3.11.patch", when="@3.11.0:3.11 ~tkinter")
# Ensure that distutils chooses correct compiler option for RPATH on cray:
patch("cray-rpath-3.1.patch", when="@3 platform=cray")
# Ensure that distutils chooses correct compiler option for RPATH:
patch("rpath-non-gcc.patch", when="@:3.11")
# Ensure that distutils chooses correct compiler option for RPATH on fj:
patch("fj-rpath-3.1.patch", when="@:3.9.7,3.10.0 %fj")

View File

@ -140,7 +140,7 @@ class Seacas(CMakePackage):
depends_on("netcdf-c@4.8.0:~mpi", when="~mpi")
depends_on("hdf5+hl~mpi", when="~mpi")
depends_on("fmt@8.1.0:", when="@2022-03-04:2022-05-16")
depends_on("fmt@8.1.0:9", when="@2022-03-04:2022-05-16")
depends_on("fmt@9.1.0", when="@2022-10-14")
depends_on("fmt@9.1.0:", when="@2023-05-30")
depends_on("matio", when="+matio")

View File

@ -12,6 +12,7 @@ class Spdlog(CMakePackage):
homepage = "https://github.com/gabime/spdlog"
url = "https://github.com/gabime/spdlog/archive/v0.9.0.tar.gz"
version("1.12.0", sha256="4dccf2d10f410c1e2feaff89966bfc49a1abb29ef6f08246335b110e001e09a9")
version("1.11.0", sha256="ca5cae8d6cac15dae0ec63b21d6ad3530070650f68076f3a4a862ca293a858bb")
version("1.10.0", sha256="697f91700237dbae2326b90469be32b876b2b44888302afbc7aceb68bcfe8224")
version("1.9.2", sha256="6fff9215f5cb81760be4cc16d033526d1080427d236e86d70bb02994f85e3d38")

View File

@ -14,6 +14,7 @@ class Subread(MakefilePackage):
homepage = "https://subread.sourceforge.net/"
url = "https://sourceforge.net/projects/subread/files/subread-1.5.2/subread-1.5.2-source.tar.gz/download"
maintainers("snehring")
version("2.0.6", sha256="f0fdda6b98634d2946028948c220253e10a0f27c7fa5f24913b65b3ac6cbb045")
version("2.0.4", sha256="c54b37ed83b34318d8f119b5c02fb9d0a65c811195bcc9e1745df6daf74ca2db")
@ -31,12 +32,11 @@ def build(self, spec, prefix):
with working_dir("src"):
if plat.startswith("linux"):
filter_file("CC_EXEC = gcc", "CC_EXEC = {0}".format(spack_cc), "Makefile.Linux")
if spec.target.family == "aarch64":
filter_file("-mtune=core2", "", "Makefile.Linux")
if spec.satisfies("@1.6.2:2.0.0"):
filter_file("-mtune=core2", "", "longread-one/Makefile")
elif spec.satisfies("@1.6.0"):
filter_file("-mtune=core2", "", "longread-mapping/Makefile")
filter_file("-mtune=core2", "", "Makefile.Linux")
if spec.satisfies("@1.6.2:"):
filter_file("-mtune=core2", "", "longread-one/Makefile")
if spec.satisfies("@1.6.0"):
filter_file("-mtune=core2", "", "longread-mapping/Makefile")
make("-f", "Makefile.Linux")
elif plat.startswith("darwin"):
make("-f", "Makefile.MacOS")

View File

@ -46,6 +46,8 @@ class Superlu(CMakePackage, Package):
conditional("cmake", when="@5:"), conditional("generic", when="@:4"), default="cmake"
)
requires("build_system=cmake", when="platform=windows")
variant("pic", default=True, description="Build with position independent code")
depends_on("blas")

View File

@ -4,6 +4,7 @@
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os
import pathlib
import sys
from spack.build_environment import dso_suffix
@ -366,6 +367,18 @@ class Trilinos(CMakePackage, CudaPackage, ROCmPackage):
conflicts("+stokhos", when="%xl")
conflicts("+stokhos", when="%xl_r")
# Current Windows support, only have serial static builds
conflicts(
"+shared",
when="platform=windows",
msg="Only static builds are supported on Windows currently.",
)
conflicts(
"+mpi",
when="platform=windows",
msg="Only serial builds are supported on Windows currently.",
)
# ###################### Dependencies ##########################
# External Kokkos
@ -393,7 +406,9 @@ class Trilinos(CMakePackage, CudaPackage, ROCmPackage):
depends_on("cgns", when="+exodus")
depends_on("cmake@3.23:", type="build", when="@14.0.0:")
depends_on("hdf5+hl", when="+hdf5")
depends_on("hypre~internal-superlu~int64", when="+hypre")
for plat in ["cray", "darwin", "linux"]:
depends_on("hypre~internal-superlu~int64", when="+hypre platform=%s" % plat)
depends_on("hypre-cmake~int64", when="+hypre platform=windows")
depends_on("kokkos-nvcc-wrapper", when="+wrapper")
depends_on("lapack")
# depends_on('perl', type=('build',)) # TriBITS finds but doesn't use...
@ -811,7 +826,7 @@ def define_tpl(trilinos_name, spack_name, have_dep):
define("CMAKE_C_COMPILER", spec["mpi"].mpicc),
define("CMAKE_CXX_COMPILER", spec["mpi"].mpicxx),
define("CMAKE_Fortran_COMPILER", spec["mpi"].mpifc),
define("MPI_BASE_DIR", spec["mpi"].prefix),
define("MPI_BASE_DIR", str(pathlib.PurePosixPath(spec["mpi"].prefix))),
]
)

View File

@ -29,6 +29,7 @@ class VtkM(CMakePackage, CudaPackage, ROCmPackage):
version("master", branch="master")
version("release", branch="release")
version("2.1.0-rc1", sha256="337df672ac5c2e0b442571a1380aa98ae70a155c93488c32198d055cb893417a")
version(
"2.0.0",
sha256="32643cf3564fa77f8e2a2a5456a574b6b2355bb68918eb62ccde493993ade1a3",

View File

@ -72,6 +72,8 @@ class Vtk(CMakePackage):
# We cannot build with both osmesa and qt in spack
conflicts("+osmesa", when="+qt")
conflicts("%gcc@13", when="@9.2")
with when("+python"):
# Depend on any Python, add bounds below.
extends("python@2.7:", type=("build", "run"))
@ -165,8 +167,20 @@ class Vtk(CMakePackage):
depends_on("proj@4:7", when="@9:")
depends_on("cgns@4.1.1:+mpi", when="@9.1: +mpi")
depends_on("cgns@4.1.1:~mpi", when="@9.1: ~mpi")
depends_on("seacas@2021-05-12:+mpi", when="@9.1: +mpi")
depends_on("seacas@2021-05-12:~mpi", when="@9.1: ~mpi")
with when("@9.1:"):
depends_on("seacas+mpi", when="+mpi")
depends_on("seacas~mpi", when="~mpi")
depends_on("seacas@2021-05-12:")
# seacas@2023-05-30 does not provide needed SEACASIoss_INCLUDE_DIRS:
# CMake Error at CMake/vtkModule.cmake:5552 (message):
# The variable `SEACASIoss_INCLUDE_DIRS` was expected to have been available,
# but was not defined:
conflicts("seacas@2023-05-30", when="@:9.2")
# vtk@9.2: need Ioss::Utils::get_debug_stream() which only 2022-10-14 provides,
# and to be safe against other issues, make them build with this version only:
depends_on("seacas@2022-10-14", when="@9.2:")
depends_on("nlohmann-json", when="@9.2:")
# For finding Fujitsu-MPI wrapper commands
@ -186,6 +200,13 @@ class Vtk(CMakePackage):
when="@9.1",
)
@when("@9.2:")
def patch(self):
# provide definition for Ioss::Init::Initializer::Initializer(),
# required on macOS, as "-undefined error" is the default,
# but not on Linux, as undefined symbols are tolerated
filter_file("TARGETS Ioss", "TARGETS Ioss Ionit", "ThirdParty/ioss/CMakeLists.txt")
def url_for_version(self, version):
url = "http://www.vtk.org/files/release/{0}/VTK-{1}.tar.gz"
return url.format(version.up_to(2), version)