aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNirbheek Chauhan <nirbheek@centricular.com>2017-04-05 01:30:34 +0530
committerNirbheek Chauhan <nirbheek@centricular.com>2017-04-05 01:30:34 +0530
commit41769d0c105f071cd7dad9eafaa4092683c583c4 (patch)
tree93ed024618c42a3c825c4d9f144eb7eb181d833c
parent8ee9365717d544c5e51ccd3daf44f0c39b818057 (diff)
downloadmeson-41769d0c105f071cd7dad9eafaa4092683c583c4.zip
meson-41769d0c105f071cd7dad9eafaa4092683c583c4.tar.gz
meson-41769d0c105f071cd7dad9eafaa4092683c583c4.tar.bz2
Prohibit ':' in project names
This would make it harder to parse an option to mesonconf such as -Dfoo:bar:baz:fun=value since it could mean either of these: * For subproject 'foo:bar:baz', set the option 'fun' to 'value' * For subproject 'foo:bar', an invalid option 'baz:fun' was set To differentiate between these two we'd need to create the list of subprojects first and then parse their options later, which complicates the parsing quite a bit.
-rw-r--r--mesonbuild/interpreter.py18
-rw-r--r--test cases/failing/43 project name colon/meson.build1
2 files changed, 12 insertions, 7 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 85e2b9a..d308342 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1630,25 +1630,29 @@ class Interpreter(InterpreterBase):
def func_project(self, node, args, kwargs):
if len(args) < 1:
raise InvalidArguments('Not enough arguments to project(). Needs at least the project name.')
+ proj_name = args[0]
+ proj_langs = args[1:]
+ if ':' in proj_name:
+ raise InvalidArguments("Project name {!r} must not contain ':'".format(proj_name))
default_options = kwargs.get('default_options', [])
if self.environment.first_invocation and (len(default_options) > 0 or
len(self.default_project_options) > 0):
self.parse_default_options(default_options)
if not self.is_subproject():
- self.build.project_name = args[0]
+ self.build.project_name = proj_name
if os.path.exists(self.option_file):
oi = optinterpreter.OptionInterpreter(self.subproject,
self.build.environment.cmd_line_options.projectoptions,
)
oi.process(self.option_file)
self.build.environment.merge_options(oi.options)
- self.active_projectname = args[0]
+ self.active_projectname = proj_name
self.project_version = kwargs.get('version', 'undefined')
if self.build.project_version is None:
self.build.project_version = self.project_version
proj_license = mesonlib.stringlistify(kwargs.get('license', 'unknown'))
- self.build.dep_manifest[args[0]] = {'version': self.project_version,
- 'license': proj_license}
+ self.build.dep_manifest[proj_name] = {'version': self.project_version,
+ 'license': proj_license}
if self.subproject in self.build.projects:
raise InvalidCode('Second call to project().')
if not self.is_subproject() and 'subproject_dir' in kwargs:
@@ -1659,9 +1663,9 @@ class Interpreter(InterpreterBase):
pv = kwargs['meson_version']
if not mesonlib.version_compare(cv, pv):
raise InterpreterException('Meson version is %s but project requires %s.' % (cv, pv))
- self.build.projects[self.subproject] = args[0]
- mlog.log('Project name: ', mlog.bold(args[0]), sep='')
- self.add_languages(args[1:], True)
+ self.build.projects[self.subproject] = proj_name
+ mlog.log('Project name: ', mlog.bold(proj_name), sep='')
+ self.add_languages(proj_langs, True)
langs = self.coredata.compilers.keys()
if 'vala' in langs:
if 'c' not in langs:
diff --git a/test cases/failing/43 project name colon/meson.build b/test cases/failing/43 project name colon/meson.build
new file mode 100644
index 0000000..53e947e
--- /dev/null
+++ b/test cases/failing/43 project name colon/meson.build
@@ -0,0 +1 @@
+project('name with :')