Reworked configure file generation.

pull/15/head
Jussi Pakkanen 12 years ago
parent ed5528ba18
commit a51036fd7d
  1. 21
      backends.py
  2. 23
      interpreter.py
  3. 2
      test cases/common/36 define10/config.h.in
  4. 12
      test cases/common/36 define10/meson.build
  5. 13
      test cases/common/36 define10/prog.c

@ -57,16 +57,21 @@ def do_mesondefine(line, confdata):
if len(arr) != 2: if len(arr) != 2:
raise interpreter.InvalidArguments('#mesondefine does not contain exactly two tokens.') raise interpreter.InvalidArguments('#mesondefine does not contain exactly two tokens.')
varname = arr[1] 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): if isinstance(v, bool):
value= v if v:
elif isinstance(v, nodes.BoolStatement): return '#define %s\n' % varname
value = v.get_value() else:
return '#undef %s\n' % varname
elif isinstance(v, int):
return '#define %s %d\n' % (varname, v)
else: else:
raise interpreter.InvalidArguments('#mesondefine argument "%s" is not boolean.' % varname) raise interpreter.InvalidArguments('#mesondefine argument "%s" is of unknown type.' % varname)
if value:
return '#define %s\n' % varname
return '/* undef %s */\n' % varname
def do_conf_file(src, dst, confdata): def do_conf_file(src, dst, confdata):
data = open(src).readlines() data = open(src).readlines()

@ -46,15 +46,17 @@ class ConfigurationData(InterpreterObject):
super().__init__() super().__init__()
self.used = False # These objects become immutable after use in configure_file. self.used = False # These objects become immutable after use in configure_file.
self.values = {} self.values = {}
self.methods.update({'set': self.set_method}) self.methods.update({'set': self.set_method,
'set10': self.set10_method,
})
def is_used(self): def is_used(self):
return self.used return self.used
def mark_used(self): def mark_used(self):
self.used = True self.used = True
def set_method(self, args, kwargs): def validate_args(self, args):
if len(args) != 2: if len(args) != 2:
raise InterpreterException("Configuration set requires 2 arguments.") raise InterpreterException("Configuration set requires 2 arguments.")
if self.used: if self.used:
@ -63,10 +65,21 @@ class ConfigurationData(InterpreterObject):
val = args[1] val = args[1]
if not isinstance(name, str): if not isinstance(name, str):
raise InterpreterException("First argument to set must be a string.") 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 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): def get(self, name):
return self.values.get(*args) return self.values[name]
def keys(self): def keys(self):
return self.values.keys() return self.values.keys()

@ -0,0 +1,2 @@
#mesondefine ONE
#mesondefine ZERO

@ -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)

@ -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;
}
Loading…
Cancel
Save