diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2024-03-13 13:30:34 -0700 |
---|---|---|
committer | Eli Schwartz <eschwartz93@gmail.com> | 2024-09-23 19:26:23 -0400 |
commit | 6e98767c31dcc23229edee4c5609d65eaf3646a8 (patch) | |
tree | 8262e6a1f93ffc22d502f88676dcfd0432204d8d | |
parent | 726d9c0b61ecdf0fbe1fb4f0d8c883eaac8108d0 (diff) | |
download | meson-6e98767c31dcc23229edee4c5609d65eaf3646a8.zip meson-6e98767c31dcc23229edee4c5609d65eaf3646a8.tar.gz meson-6e98767c31dcc23229edee4c5609d65eaf3646a8.tar.bz2 |
dependency: define equality and hash operators for Dependency
When a dependency is copied and its name is changed, we still need a way
to say "this is the same dependency", which we now have. It is
important, however, when a partial dependency is created that dependency
does *not* match the original dependency, since they are not providing
the same data. This was always happening for InternalDependencies as an
implementation detail, but not for other kinds.
-rw-r--r-- | mesonbuild/dependencies/base.py | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index 239098c..ed6138a 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -1,5 +1,6 @@ # SPDX-License-Identifier: Apache-2.0 # Copyright 2013-2018 The Meson development team +# Copyright © 2024 Intel Corporation # This file contains the detection logic for external dependencies. # Custom logic for several other packages are in separate files. @@ -10,6 +11,7 @@ import os import collections import itertools import typing as T +import uuid from enum import Enum from .. import mlog, mesonlib @@ -106,6 +108,9 @@ class Dependency(HoldableObject): return kwargs['include_type'] def __init__(self, type_name: DependencyTypeName, kwargs: T.Dict[str, T.Any]) -> None: + # This allows two Dependencies to be compared even after being copied. + # The purpose is to allow the name to be changed, but still have a proper comparison + self._id = uuid.uuid4().int self.name = f'dep{id(self)}' self.version: T.Optional[str] = None self.language: T.Optional[str] = None # None means C-like @@ -124,6 +129,14 @@ class Dependency(HoldableObject): self.featurechecks: T.List['FeatureCheckBase'] = [] self.feature_since: T.Optional[T.Tuple[str, str]] = None + def __eq__(self, other: object) -> bool: + if not isinstance(other, Dependency): + return NotImplemented + return self._id == other._id + + def __hash__(self) -> int: + return self._id + def __repr__(self) -> str: return f'<{self.__class__.__name__} {self.name}: {self.is_found}>' @@ -402,6 +415,7 @@ class ExternalDependency(Dependency, HasNativeKwarg): link_args: bool = False, links: bool = False, includes: bool = False, sources: bool = False) -> Dependency: new = copy.copy(self) + new._id = uuid.uuid4().int if not compile_args: new.compile_args = [] if not link_args: @@ -472,7 +486,9 @@ class NotFoundDependency(Dependency): def get_partial_dependency(self, *, compile_args: bool = False, link_args: bool = False, links: bool = False, includes: bool = False, sources: bool = False) -> 'NotFoundDependency': - return copy.copy(self) + new = copy.copy(self) + new._id = uuid.uuid4().int + return new class ExternalLibrary(ExternalDependency): @@ -512,6 +528,7 @@ class ExternalLibrary(ExternalDependency): # External library only has link_args, so ignore the rest of the # interface. new = copy.copy(self) + new._id = uuid.uuid4().int if not link_args: new.link_args = [] return new |