Forbid backslashes on compiler command lines. It is unfortunately the only reliable way.
This commit is contained in:
parent
f1bf87ec8a
commit
6830f3e147
23
build.py
23
build.py
|
@ -46,6 +46,27 @@ known_shlib_kwargs = known_basic_kwargs.copy()
|
||||||
known_shlib_kwargs.update({'version' : True,
|
known_shlib_kwargs.update({'version' : True,
|
||||||
'soversion' : 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):
|
class InvalidArguments(coredata.MesonException):
|
||||||
pass
|
pass
|
||||||
|
@ -513,6 +534,8 @@ class BuildTarget():
|
||||||
for a in args:
|
for a in args:
|
||||||
if not isinstance(a, (str, File)):
|
if not isinstance(a, (str, File)):
|
||||||
raise InvalidArguments('A non-string passed to compiler args.')
|
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:
|
if language in self.extra_args:
|
||||||
self.extra_args[language] += args
|
self.extra_args[language] += args
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
project('stringdef', 'c')
|
||||||
|
|
||||||
|
test('stringdef', executable('stringdef', 'stringdef.c', c_args : '-DFOO="bar"'))
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue