aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2015-07-05 01:47:34 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2015-07-05 01:47:34 +0300
commit833cb56f5c5944dc96480104a1852561a0546fe2 (patch)
tree2b6e703198ec1261bd1f23a8aeb08cd54936916d
parentf03be73f0282bc08c39eec07dadd23ba9e65fda9 (diff)
downloadmeson-833cb56f5c5944dc96480104a1852561a0546fe2.zip
meson-833cb56f5c5944dc96480104a1852561a0546fe2.tar.gz
meson-833cb56f5c5944dc96480104a1852561a0546fe2.tar.bz2
Can create top level targets that have the same name but different type.
-rw-r--r--build.py17
-rw-r--r--interpreter.py36
-rw-r--r--ninjabackend.py8
-rw-r--r--test cases/common/86 same basename/exe1.c5
-rw-r--r--test cases/common/86 same basename/exe2.c5
-rw-r--r--test cases/common/86 same basename/meson.build10
-rw-r--r--test cases/common/86 same basename/shar.c3
-rw-r--r--test cases/common/86 same basename/stat.c3
-rw-r--r--test cases/failing/17 same name/file.c3
-rw-r--r--test cases/failing/17 same name/meson.build4
-rw-r--r--test cases/failing/17 same name/sub/file2.c3
-rw-r--r--test cases/failing/17 same name/sub/meson.build1
12 files changed, 74 insertions, 24 deletions
diff --git a/build.py b/build.py
index c6fe7e8..9cdd06e 100644
--- a/build.py
+++ b/build.py
@@ -585,6 +585,8 @@ class Executable(BuildTarget):
else:
self.filename = self.name
+ def type_suffix(self):
+ return "@exe"
class StaticLibrary(BuildTarget):
def __init__(self, name, subdir, is_cross, sources, objects, environment, kwargs):
@@ -601,6 +603,9 @@ class StaticLibrary(BuildTarget):
def get_osx_filename(self):
return self.get_filename()
+ def type_suffix(self):
+ return "@sta"
+
class SharedLibrary(BuildTarget):
def __init__(self, name, subdir, is_cross, sources, objects, environment, kwargs):
self.version = None
@@ -666,6 +671,9 @@ class SharedLibrary(BuildTarget):
aliases.append(self.get_shbase())
return aliases
+ def type_suffix(self):
+ return "@sha"
+
class CustomTarget:
known_kwargs = {'input' : True,
'output' : True,
@@ -788,6 +796,9 @@ class CustomTarget:
def get_generated_sources(self):
return []
+ def type_suffix(self):
+ return "@cus"
+
class RunTarget:
def __init__(self, name, command, args, subdir):
self.name = name
@@ -816,6 +827,9 @@ class RunTarget:
def get_filename(self):
return self.name
+ def type_suffix(self):
+ return "@run"
+
class Jar(BuildTarget):
def __init__(self, name, subdir, is_cross, sources, objects, environment, kwargs):
super().__init__(name, subdir, is_cross, sources, objects, environment, kwargs);
@@ -827,6 +841,9 @@ class Jar(BuildTarget):
def get_main_class(self):
return self.main_class
+ def type_suffix(self):
+ return "@jar"
+
class ConfigureFile():
def __init__(self, subdir, sourcename, targetname, configuration_data):
diff --git a/interpreter.py b/interpreter.py
index 4bd7c6f..5f74215 100644
--- a/interpreter.py
+++ b/interpreter.py
@@ -1373,13 +1373,8 @@ class Interpreter():
if len(args) != 1:
raise InterpreterException('Incorrect number of arguments')
name = args[0]
- if name in coredata.forbidden_target_names:
- raise InvalidArguments('Target name "%s" is reserved for Meson\'s internal use. Please rename.'\
- % name)
- if name in self.build.targets:
- raise InvalidCode('Tried to create target "%s", but a target of that name already exists.' % name)
tg = CustomTargetHolder(build.CustomTarget(name, self.subdir, kwargs))
- self.build.targets[name] = tg.held_object
+ self.add_target(name, tg.held_object)
return tg
@stringArgs
@@ -1388,15 +1383,10 @@ class Interpreter():
if len(args) < 2:
raise InterpreterException('Incorrect number of arguments')
name = args[0]
- if name in coredata.forbidden_target_names:
- raise InvalidArguments('Target name "%s" is reserved for Meson\'s internal use. Please rename.'\
- % name)
- if name in self.build.targets:
- raise InvalidCode('Tried to create target "%s", but a target of that name already exists.' % name)
command = args[1]
cmd_args = args[2:]
tg = RunTargetHolder(name, command, cmd_args, self.subdir)
- self.build.targets[name] = tg.held_object
+ self.add_target(name, tg.held_object)
return tg
def func_generator(self, node, args, kwargs):
@@ -1609,6 +1599,19 @@ class Interpreter():
results.append(s)
return results
+ def add_target(self, name, tobj):
+ if name in coredata.forbidden_target_names:
+ raise InvalidArguments('Target name "%s" is reserved for Meson\'s internal use. Please rename.'\
+ % name)
+ # To permit an executable and a shared library to have the
+ # same name, such as "foo.exe" and "libfoo.a".
+ idname = name + tobj.type_suffix()
+ if idname in self.build.targets:
+ raise InvalidCode('Tried to create target "%s", but a target of that name already exists.' % name)
+ self.build.targets[idname] = tobj
+ if idname not in self.coredata.target_guids:
+ self.coredata.target_guids[idname] = str(uuid.uuid4()).upper()
+
def build_target(self, node, args, kwargs, targetholder):
name = args[0]
sources = args[1:]
@@ -1619,9 +1622,6 @@ class Interpreter():
is_cross = True
else:
is_cross = False
- if name in coredata.forbidden_target_names:
- raise InvalidArguments('Target name "%s" is reserved for Meson\'s internal use. Please rename.'\
- % name)
try:
kw_src = self.flatten(kwargs['sources'])
if not isinstance(kw_src, list):
@@ -1634,8 +1634,6 @@ class Interpreter():
kwargs['dependencies'] = self.flatten(kwargs.get('dependencies', []))
if not isinstance(objs, list):
objs = [objs]
- if name in self.build.targets:
- raise InvalidCode('Tried to create target "%s", but a target of that name already exists.' % name)
self.check_sources_exist(os.path.join(self.source_root, self.subdir), sources)
if targetholder is ExecutableHolder:
targetclass = build.Executable
@@ -1650,9 +1648,7 @@ class Interpreter():
raise RuntimeError('Unreachable code')
target = targetclass(name, self.subdir, is_cross, sources, objs, self.environment, kwargs)
l = targetholder(target)
- self.build.targets[name] = l.held_object
- if name not in self.coredata.target_guids:
- self.coredata.target_guids[name] = str(uuid.uuid4()).upper()
+ self.add_target(name, l.held_object)
self.global_args_frozen = True
return l
diff --git a/ninjabackend.py b/ninjabackend.py
index e97dac4..f00cc5b 100644
--- a/ninjabackend.py
+++ b/ninjabackend.py
@@ -164,7 +164,7 @@ class NinjaBackend(backends.Backend):
self.generate_custom_target(target, outfile)
if isinstance(target, build.RunTarget):
self.generate_run_target(target, outfile)
- name = target.get_basename()
+ name = target.get_basename() + target.type_suffix()
gen_src_deps = []
if name in self.processed_targets:
return
@@ -266,7 +266,7 @@ class NinjaBackend(backends.Backend):
def process_target_dependencies(self, target, outfile):
for t in target.get_dependencies():
- tname = t.get_basename()
+ tname = t.get_basename() + t.type_suffix()
if not tname in self.processed_targets:
self.generate_target(t, outfile)
@@ -305,7 +305,7 @@ class NinjaBackend(backends.Backend):
elem.add_item('COMMAND', cmd)
elem.add_item('description', 'Generating %s with a custom command.' % target.name)
elem.write(outfile)
- self.processed_targets[target.name] = True
+ self.processed_targets[target.name + target.type_suffix()] = True
def generate_run_target(self, target, outfile):
runnerscript = os.path.join(self.environment.get_script_dir(), 'commandrunner.py')
@@ -316,7 +316,7 @@ class NinjaBackend(backends.Backend):
elem.add_item('description', 'Running external command %s.' % target.name)
elem.add_item('pool', 'console')
elem.write(outfile)
- self.processed_targets[target.name] = True
+ self.processed_targets[target.name + target.type_suffix()] = True
def generate_po(self, outfile):
for p in self.build.pot:
diff --git a/test cases/common/86 same basename/exe1.c b/test cases/common/86 same basename/exe1.c
new file mode 100644
index 0000000..175a90d
--- /dev/null
+++ b/test cases/common/86 same basename/exe1.c
@@ -0,0 +1,5 @@
+int func();
+
+int main(int argc, char **argv) {
+ return func();
+}
diff --git a/test cases/common/86 same basename/exe2.c b/test cases/common/86 same basename/exe2.c
new file mode 100644
index 0000000..56b04cc
--- /dev/null
+++ b/test cases/common/86 same basename/exe2.c
@@ -0,0 +1,5 @@
+int func();
+
+int main(int argc, char **argv) {
+ return func() == 1 ? 0 : 1;
+}
diff --git a/test cases/common/86 same basename/meson.build b/test cases/common/86 same basename/meson.build
new file mode 100644
index 0000000..5d9cb72
--- /dev/null
+++ b/test cases/common/86 same basename/meson.build
@@ -0,0 +1,10 @@
+project('same basename', 'c')
+
+stlib = static_library('name', 'stat.c')
+shlib = shared_library('name', 'shar.c')
+
+exe1 = executable('name', 'exe1.c', link_with : stlib)
+exe2 = executable('name2', 'exe2.c', link_with : shlib)
+
+test('static', exe1)
+test('shared', exe2)
diff --git a/test cases/common/86 same basename/shar.c b/test cases/common/86 same basename/shar.c
new file mode 100644
index 0000000..bc1e7b0
--- /dev/null
+++ b/test cases/common/86 same basename/shar.c
@@ -0,0 +1,3 @@
+int func() {
+ return 1;
+}
diff --git a/test cases/common/86 same basename/stat.c b/test cases/common/86 same basename/stat.c
new file mode 100644
index 0000000..6f1c172
--- /dev/null
+++ b/test cases/common/86 same basename/stat.c
@@ -0,0 +1,3 @@
+int func() {
+ return 0;
+}
diff --git a/test cases/failing/17 same name/file.c b/test cases/failing/17 same name/file.c
new file mode 100644
index 0000000..6f1c172
--- /dev/null
+++ b/test cases/failing/17 same name/file.c
@@ -0,0 +1,3 @@
+int func() {
+ return 0;
+}
diff --git a/test cases/failing/17 same name/meson.build b/test cases/failing/17 same name/meson.build
new file mode 100644
index 0000000..4e585d5
--- /dev/null
+++ b/test cases/failing/17 same name/meson.build
@@ -0,0 +1,4 @@
+project('same name', 'c')
+
+static_library('foo', 'file.c')
+subdir('sub')
diff --git a/test cases/failing/17 same name/sub/file2.c b/test cases/failing/17 same name/sub/file2.c
new file mode 100644
index 0000000..a5e453d
--- /dev/null
+++ b/test cases/failing/17 same name/sub/file2.c
@@ -0,0 +1,3 @@
+int func() {
+ return 5;
+}
diff --git a/test cases/failing/17 same name/sub/meson.build b/test cases/failing/17 same name/sub/meson.build
new file mode 100644
index 0000000..610a4a3
--- /dev/null
+++ b/test cases/failing/17 same name/sub/meson.build
@@ -0,0 +1 @@
+static_library('foo', 'file2.c')