Skip to content

Commit

Permalink
Forbid backslashes on compiler command lines. It is unfortunately the…
Browse files Browse the repository at this point in the history
… only reliable way.
  • Loading branch information
jpakkane committed Jan 2, 2016
1 parent f1bf87e commit 6830f3e
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 0 deletions.
23 changes: 23 additions & 0 deletions build.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,27 @@
known_shlib_kwargs.update({'version' : True,
'soversion' : True})

backslash_explanation = \
'''Compiler arguments have a backslash "\\" character. This is unfortunately not
permitted. The reason for this is that backslash is a shell quoting character
that behaves differently across different systems. Because of this is it not
possible to make it work reliably across all the platforms Meson needs to
support.
There are several different ways of working around this issue. Most of the time
you are using this to provide a -D define to your compiler. Try instead to
create a config.h file and put all of your definitions in it using
configure_file().
Another approach is to move the backslashes into the source and have the other
bits in the def. So you would have an arg -DPLAIN_TEXT="foo" and then in your
C sources something like this:
const char *fulltext = "\\\\" PLAIN_TEXT;
We are fully aware that these are not really usable or pleasant ways to do
this but it's the best we can do given the way shell quoting works.
'''

class InvalidArguments(coredata.MesonException):
pass
Expand Down Expand Up @@ -513,6 +534,8 @@ def add_compiler_args(self, language, args):
for a in args:
if not isinstance(a, (str, File)):
raise InvalidArguments('A non-string passed to compiler args.')
if isinstance(a, str) and '\\' in a:
raise InvalidArguments(backslash_explanation)
if language in self.extra_args:
self.extra_args[language] += args
else:
Expand Down
3 changes: 3 additions & 0 deletions test cases/common/104 stringdef/meson.build
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
project('stringdef', 'c')

test('stringdef', executable('stringdef', 'stringdef.c', c_args : '-DFOO="bar"'))
10 changes: 10 additions & 0 deletions test cases/common/104 stringdef/stringdef.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#include<stdio.h>
#include<string.h>

int main(int argc, char **argv) {
if(strcmp(FOO, "bar")) {
printf("FOO is misquoted: %s\n", FOO);
return 1;
}
return 0;
}
File renamed without changes.
File renamed without changes.

0 comments on commit 6830f3e

Please sign in to comment.