aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/utils
diff options
context:
space:
mode:
authorJan200101 <sentrycraft123@gmail.com>2023-01-23 21:41:43 +0100
committerJussi Pakkanen <jpakkane@gmail.com>2023-08-08 14:53:43 -0700
commitb91244c3b7f77578d601502628bceb9e92183387 (patch)
treefa7656867fd7a32922d30003c528e697f0c19ebf /mesonbuild/utils
parent3de0f6d4e94036646321859b9287faba6e99f050 (diff)
downloadmeson-b91244c3b7f77578d601502628bceb9e92183387.zip
meson-b91244c3b7f77578d601502628bceb9e92183387.tar.gz
meson-b91244c3b7f77578d601502628bceb9e92183387.tar.bz2
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
Diffstat (limited to 'mesonbuild/utils')
-rw-r--r--mesonbuild/utils/universal.py38
1 files changed, 28 insertions, 10 deletions
diff --git a/mesonbuild/utils/universal.py b/mesonbuild/utils/universal.py
index 5b7750c..ac239ed 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: