diff options
| author | Jan200101 <sentrycraft123@gmail.com> | 2023-01-23 21:41:43 +0100 |
|---|---|---|
| committer | Jussi Pakkanen <jpakkane@gmail.com> | 2023-08-08 14:53:43 -0700 |
| commit | b91244c3b7f77578d601502628bceb9e92183387 (patch) | |
| tree | fa7656867fd7a32922d30003c528e697f0c19ebf | |
| parent | 3de0f6d4e94036646321859b9287faba6e99f050 (diff) | |
| download | meson-b91244c3b7f77578d601502628bceb9e92183387.tar.gz | |
correct cmakedefine behavior
- allow defines with leading whitespace
- always do replacement for cmakedefine
- output boolean value for cmakedefine01
- correct unittests for cmakedefine
- add cmakedefine specific unittests
| -rw-r--r-- | mesonbuild/utils/universal.py | 38 | ||||
| -rw-r--r-- | unittests/allplatformstests.py | 38 |
2 files changed, 63 insertions, 13 deletions
diff --git a/mesonbuild/utils/universal.py b/mesonbuild/utils/universal.py index 5b7750c99..ac239ed55 100644 --- a/mesonbuild/utils/universal.py +++ b/mesonbuild/utils/universal.py @@ -1207,6 +1207,8 @@ def do_replacement(regex: T.Pattern[str], line: str, var, _ = confdata.get(varname) if isinstance(var, str): var_str = var + elif isinstance(var, bool): + var_str = str(int(var)) elif isinstance(var, int): var_str = str(var) else: @@ -1220,8 +1222,17 @@ def do_replacement(regex: T.Pattern[str], line: str, def do_define(regex: T.Pattern[str], line: str, confdata: 'ConfigurationData', variable_format: Literal['meson', 'cmake', 'cmake@'], subproject: T.Optional[SubProject] = None) -> str: + cmake_bool_define = False + if variable_format != "meson": + cmake_bool_define = "cmakedefine01" in line + def get_cmake_define(line: str, confdata: 'ConfigurationData') -> str: arr = line.split() + + if cmake_bool_define: + (v, desc) = confdata.get(arr[1]) + return str(int(bool(v))) + define_value: T.List[str] = [] for token in arr[2:]: try: @@ -1243,22 +1254,29 @@ def do_define(regex: T.Pattern[str], line: str, confdata: 'ConfigurationData', try: v, _ = confdata.get(varname) except KeyError: - return '/* #undef %s */\n' % varname - if isinstance(v, bool): - if v: - return '#define %s\n' % varname + if cmake_bool_define: + return '#define %s 0\n' % varname else: - return '#undef %s\n' % varname - elif isinstance(v, int): - return '#define %s %d\n' % (varname, v) - elif isinstance(v, str): + return '/* #undef %s */\n' % varname + + if isinstance(v, str) or variable_format != "meson": if variable_format == 'meson': result = v else: + if not cmake_bool_define and not v: + return '/* #undef %s */\n' % varname + result = get_cmake_define(line, confdata) - result = f'#define {varname} {result}\n' + result = f'#define {varname} {result}'.strip() + '\n' result, _ = do_replacement(regex, result, variable_format, confdata) return result + elif isinstance(v, bool): + 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 MesonException('#mesondefine argument "%s" is of unknown type.' % varname) @@ -1295,7 +1313,7 @@ def do_conf_str(src: str, data: T.List[str], confdata: 'ConfigurationData', # during substitution so we can warn the user to use the `copy:` kwarg. confdata_useless = not confdata.keys() for line in data: - if line.startswith(search_token): + if line.lstrip().startswith(search_token): confdata_useless = False line = do_define(regex, line, confdata, variable_format, subproject) else: diff --git a/unittests/allplatformstests.py b/unittests/allplatformstests.py index 7f38d4b09..f7fb1b0c5 100644 --- a/unittests/allplatformstests.py +++ b/unittests/allplatformstests.py @@ -153,20 +153,33 @@ class AllPlatformTests(BasePlatformTests): (result, missing_variables, confdata_useless) = do_conf_str('configuration_file', in_data, confdata, variable_format = vformat) return '\n'.join(result) - def check_formats(confdata, result): + def check_meson_format(confdata, result): self.assertEqual(conf_str(['#mesondefine VAR'], confdata, 'meson'), result) + + def check_cmake_format_simple(confdata, result): + self.assertEqual(conf_str(['#cmakedefine VAR'], confdata, 'cmake'), result) + + def check_cmake_formats_full(confdata, result): self.assertEqual(conf_str(['#cmakedefine VAR ${VAR}'], confdata, 'cmake'), result) self.assertEqual(conf_str(['#cmakedefine VAR @VAR@'], confdata, 'cmake@'), result) + def check_formats(confdata, result): + check_meson_format(confdata, result) + check_cmake_formats_full(confdata, result) + confdata = ConfigurationData() # Key error as they do not exists check_formats(confdata, '/* #undef VAR */\n') # Check boolean confdata.values = {'VAR': (False, 'description')} - check_formats(confdata, '#undef VAR\n') + check_meson_format(confdata, '#undef VAR\n') + check_cmake_formats_full(confdata, '/* #undef VAR */\n') + confdata.values = {'VAR': (True, 'description')} - check_formats(confdata, '#define VAR\n') + check_meson_format(confdata, '#define VAR\n') + check_cmake_format_simple(confdata, '#define VAR\n') + check_cmake_formats_full(confdata, '#define VAR 1\n') # Check string confdata.values = {'VAR': ('value', 'description')} @@ -176,6 +189,25 @@ class AllPlatformTests(BasePlatformTests): confdata.values = {'VAR': (10, 'description')} check_formats(confdata, '#define VAR 10\n') + # Checking if cmakedefine behaves as it does with cmake + confdata.values = {'VAR': ("var", 'description')} + self.assertEqual(conf_str(['#cmakedefine VAR @VAR@'], confdata, 'cmake@'), '#define VAR var\n') + + confdata.values = {'VAR': (True, 'description')} + self.assertEqual(conf_str(['#cmakedefine01 VAR'], confdata, 'cmake'), '#define VAR 1\n') + + confdata.values = {'VAR': (0, 'description')} + self.assertEqual(conf_str(['#cmakedefine01 VAR'], confdata, 'cmake'), '#define VAR 0\n') + confdata.values = {'VAR': (False, 'description')} + self.assertEqual(conf_str(['#cmakedefine01 VAR'], confdata, 'cmake'), '#define VAR 0\n') + + confdata.values = {} + self.assertEqual(conf_str(['#cmakedefine01 VAR'], confdata, 'cmake'), '#define VAR 0\n') + self.assertEqual(conf_str(['#cmakedefine VAR @VAR@'], confdata, 'cmake@'), '/* #undef VAR */\n') + + confdata.values = {'VAR': (5, 'description')} + self.assertEqual(conf_str(['#cmakedefine VAR'], confdata, 'cmake'), '#define VAR\n') + # Check multiple string with cmake formats confdata.values = {'VAR': ('value', 'description')} self.assertEqual(conf_str(['#cmakedefine VAR xxx @VAR@ yyy @VAR@'], confdata, 'cmake@'), '#define VAR xxx value yyy value\n') |
