summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/build.py1
-rw-r--r--mesonbuild/interpreter/interpreter.py18
2 files changed, 13 insertions, 6 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py
index 05ec9deb7..4fc409a8d 100644
--- a/mesonbuild/build.py
+++ b/mesonbuild/build.py
@@ -252,6 +252,7 @@ class Build:
self.environment = environment
self.projects = {}
self.targets: 'T.OrderedDict[str, T.Union[CustomTarget, BuildTarget]]' = OrderedDict()
+ self.targetnames: T.Set[T.Tuple[str, str]] = set() # Set of executable names and their subdir
self.global_args: PerMachine[T.Dict[str, T.List[str]]] = PerMachine({}, {})
self.global_link_args: PerMachine[T.Dict[str, T.List[str]]] = PerMachine({}, {})
self.projects_args: PerMachine[T.Dict[str, T.Dict[str, T.List[str]]]] = PerMachine({}, {})
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 7fb3c9234..2fba33486 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -3163,12 +3163,15 @@ class Interpreter(InterpreterBase, HoldableObject):
# To permit an executable and a shared library to have the
# same name, such as "foo.exe" and "libfoo.a".
idname = tobj.get_id()
- for t in self.build.targets.values():
- if t.get_id() == idname:
- raise InvalidCode(f'Tried to create target "{name}", but a target of that name already exists.')
- if isinstance(tobj, build.Executable) and isinstance(t, build.Executable) and t.name == tobj.name:
- FeatureNew.single_use('multiple executables with the same name but different suffixes',
- '1.3.0', self.subproject, location=self.current_node)
+ subdir = tobj.get_subdir()
+ namedir = (name, subdir)
+
+ if idname in self.build.targets:
+ raise InvalidCode(f'Tried to create target "{name}", but a target of that name already exists.')
+
+ if isinstance(tobj, build.Executable) and namedir in self.build.targetnames:
+ FeatureNew.single_use(f'multiple executables with the same name, "{tobj.name}", but different suffixes in the same directory',
+ '1.3.0', self.subproject, location=self.current_node)
if isinstance(tobj, build.BuildTarget):
self.add_languages(tobj.missing_languages, True, tobj.for_machine)
@@ -3176,6 +3179,9 @@ class Interpreter(InterpreterBase, HoldableObject):
self.add_stdlib_info(tobj)
self.build.targets[idname] = tobj
+ # Only need to add executables to this set
+ if isinstance(tobj, build.Executable):
+ self.build.targetnames.update([namedir])
if idname not in self.coredata.target_guids:
self.coredata.target_guids[idname] = str(uuid.uuid4()).upper()