diff options
-rwxr-xr-x | backends.py | 21 | ||||
-rwxr-xr-x | interpreter.py | 23 | ||||
-rw-r--r-- | test cases/common/36 define10/config.h.in | 2 | ||||
-rw-r--r-- | test cases/common/36 define10/meson.build | 12 | ||||
-rw-r--r-- | test cases/common/36 define10/prog.c | 13 |
5 files changed, 58 insertions, 13 deletions
diff --git a/backends.py b/backends.py index 6684aea..7bea10a 100755 --- a/backends.py +++ b/backends.py @@ -57,16 +57,21 @@ def do_mesondefine(line, confdata): if len(arr) != 2: raise interpreter.InvalidArguments('#mesondefine does not contain exactly two tokens.') varname = arr[1] - v = confdata.get(varname, False) + try: + v = confdata.get(varname) + except KeyError: + return '/* undef %s */\n' % varname + if isinstance(v, nodes.BoolStatement): + v = v.get_value() if isinstance(v, bool): - value= v - elif isinstance(v, nodes.BoolStatement): - value = v.get_value() + if v: + return '#define %s\n' % varname + else: + return '#undef %s\n' % varname + elif isinstance(v, int): + return '#define %s %d\n' % (varname, v) else: - raise interpreter.InvalidArguments('#mesondefine argument "%s" is not boolean.' % varname) - if value: - return '#define %s\n' % varname - return '/* undef %s */\n' % varname + raise interpreter.InvalidArguments('#mesondefine argument "%s" is of unknown type.' % varname) def do_conf_file(src, dst, confdata): data = open(src).readlines() diff --git a/interpreter.py b/interpreter.py index ede7e1b..9f6b075 100755 --- a/interpreter.py +++ b/interpreter.py @@ -46,15 +46,17 @@ class ConfigurationData(InterpreterObject): super().__init__() self.used = False # These objects become immutable after use in configure_file. self.values = {} - self.methods.update({'set': self.set_method}) - + self.methods.update({'set': self.set_method, + 'set10': self.set10_method, + }) + def is_used(self): return self.used def mark_used(self): self.used = True - def set_method(self, args, kwargs): + def validate_args(self, args): if len(args) != 2: raise InterpreterException("Configuration set requires 2 arguments.") if self.used: @@ -63,10 +65,21 @@ class ConfigurationData(InterpreterObject): val = args[1] if not isinstance(name, str): raise InterpreterException("First argument to set must be a string.") + return (name, val) + + def set_method(self, args, kwargs): + (name, val) = self.validate_args(args) self.values[name] = val + + def set10_method(self, args, kwargs): + (name, val) = self.validate_args(args) + if val: + self.values[name] = 1 + else: + self.values[name] = 0 - def get(self, *args): - return self.values.get(*args) + def get(self, name): + return self.values[name] def keys(self): return self.values.keys() diff --git a/test cases/common/36 define10/config.h.in b/test cases/common/36 define10/config.h.in new file mode 100644 index 0000000..dc77346 --- /dev/null +++ b/test cases/common/36 define10/config.h.in @@ -0,0 +1,2 @@ +#mesondefine ONE +#mesondefine ZERO diff --git a/test cases/common/36 define10/meson.build b/test cases/common/36 define10/meson.build new file mode 100644 index 0000000..94f02a1 --- /dev/null +++ b/test cases/common/36 define10/meson.build @@ -0,0 +1,12 @@ +project('set10test', 'c') + +conf = configuration_data() +conf.set10('ONE', true) +conf.set10('ZERO', false) + +configure_file(input : 'config.h.in', + output : 'config.h', + configuration : conf) + +exe = executable('prog', 'prog.c', include_dirs : include_directories('.')) +test('10test', exe) diff --git a/test cases/common/36 define10/prog.c b/test cases/common/36 define10/prog.c new file mode 100644 index 0000000..10e94f1 --- /dev/null +++ b/test cases/common/36 define10/prog.c @@ -0,0 +1,13 @@ +#include<stdio.h> +#include"config.h" + +int main(int argc, char **argv) { + if(ONE != 1) { + fprintf(stderr, "ONE is not 1.\n"); + return 1; + } + if(ZERO != 0) { + fprintf(stderr, "ZERO is not 0.\n"); + } + return 0; +} |