Forbid backslashes on compiler command lines. It is unfortunately the only reliable way.

This commit is contained in:
Jussi Pakkanen 2016-01-02 20:34:06 +02:00
parent f1bf87ec8a
commit 6830f3e147
5 changed files with 36 additions and 0 deletions

View File

@ -46,6 +46,27 @@ known_shlib_kwargs = known_basic_kwargs.copy()
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
@ -513,6 +534,8 @@ class BuildTarget():
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:

View File

@ -0,0 +1,3 @@
project('stringdef', 'c')
test('stringdef', executable('stringdef', 'stringdef.c', c_args : '-DFOO="bar"'))

View File

@ -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;
}