Skip to content

Commit 4e1ec38

Browse files
committed
Add C++ macro query variable
1 parent 4d4fd35 commit 4e1ec38

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

src/semiwrap/cmd_genmeson.py

+25-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
BuildTargetOutput,
1919
ExtensionModule,
2020
LocalDependency,
21+
CppMacroValue,
2122
makeplan,
2223
)
2324
from .util import maybe_write_file, relpath_walk_up
@@ -47,7 +48,9 @@ def _make_string(s: str):
4748
return f"'{s}'"
4849

4950

50-
VarTypes = T.Union[InputFile, OutputFile, BuildTarget, ExtensionModule, LocalDependency]
51+
VarTypes = T.Union[
52+
InputFile, OutputFile, BuildTarget, ExtensionModule, LocalDependency, CppMacroValue
53+
]
5154

5255

5356
class VarCache:
@@ -80,6 +83,9 @@ def getvar(self, item: VarTypes) -> str:
8083
elif isinstance(item, LocalDependency):
8184
name = item.name.replace("-", "_")
8285
var = f"{name}_dep"
86+
elif isinstance(item, CppMacroValue):
87+
name = item.name
88+
var = f"_sw_cpp_var_{name}"
8389
else:
8490
assert False
8591

@@ -118,6 +124,8 @@ def _render_build_target(r: RenderBuffer, vc: VarCache, bt: BuildTarget):
118124
elif isinstance(arg, ExtensionModule):
119125
cmd.append(f"'@INPUT{len(tinput)}@'")
120126
tinput.append(vc.getvar(arg))
127+
elif isinstance(arg, CppMacroValue):
128+
cmd.append(vc.getvar(arg))
121129
else:
122130
assert False, f"unexpected {arg!r} in {bt}"
123131

@@ -295,6 +303,8 @@ def gen_meson(
295303
# is simpler to generate
296304

297305
plan = makeplan(pathlib.Path(project_root))
306+
macros: T.List[CppMacroValue] = []
307+
build_targets: T.List[BuildTarget] = []
298308
modules: T.List[ExtensionModule] = []
299309
pyi_targets: T.List[BuildTarget] = []
300310
local_deps: T.List[LocalDependency] = []
@@ -308,17 +318,30 @@ def gen_meson(
308318
elif item.command == "dat2trampoline":
309319
trampoline_targets.append(item)
310320
else:
311-
_render_build_target(r0, vc, item)
321+
build_targets.append(item)
312322
elif isinstance(item, ExtensionModule):
313323
# defer these to the end
314324
modules.append(item)
315325
elif isinstance(item, Entrypoint):
316326
eps.append(item)
317327
elif isinstance(item, LocalDependency):
318328
local_deps.append(item)
329+
elif isinstance(item, CppMacroValue):
330+
macros.append(item)
319331
else:
320332
assert False
321333

334+
if macros:
335+
for macro in macros:
336+
macro_name = _make_string(macro.name)
337+
r0.writeln(
338+
f"{vc.getvar(macro)} = meson.get_compiler('cpp').get_define({macro_name})"
339+
)
340+
r0.writeln()
341+
342+
for target in build_targets:
343+
_render_build_target(r0, vc, target)
344+
322345
if local_deps:
323346
r0.writeln()
324347
r0.write_trim(

src/semiwrap/cmd_header2dat.py

+4
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ def make_argparser() -> argparse.ArgumentParser:
103103
parser = argparse.ArgumentParser(description=__doc__)
104104
parser.add_argument("-I", "--include-paths", action="append", default=[])
105105
parser.add_argument("-D", "--pp-defines", action="append", default=[])
106+
parser.add_argument("--cpp")
106107
parser.add_argument("name")
107108
parser.add_argument("src_yml", type=pathlib.Path)
108109
parser.add_argument("src_h", type=pathlib.Path)
@@ -120,6 +121,9 @@ def main():
120121
with open(args.in_casters, "rb") as fp:
121122
casters = pickle.load(fp)
122123

124+
if args.cpp:
125+
args.pp_defines.append(f"__cplusplus {args.cpp}")
126+
123127
generate_wrapper(
124128
name=args.name,
125129
src_yml=args.src_yml,

src/semiwrap/makeplan.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ class Entrypoint:
3232
package: str
3333

3434

35+
@dataclasses.dataclass(frozen=True)
36+
class CppMacroValue:
37+
"""
38+
Represents the value of a macro defined by the C++ compiler
39+
"""
40+
41+
name: str
42+
43+
3544
@dataclasses.dataclass(frozen=True)
3645
class LocalDependency:
3746
name: str
@@ -77,6 +86,7 @@ class BuildTarget:
7786
Depfile,
7887
BuildTarget,
7988
BuildTargetOutput,
89+
CppMacroValue,
8090
],
8191
...,
8292
]
@@ -149,6 +159,10 @@ def generate(self):
149159
for name, caster_cfg in projectcfg.export_type_casters.items():
150160
yield from self._process_export_type_caster(name, caster_cfg)
151161

162+
# This is needed elsewhere
163+
self._cpp_macro = CppMacroValue("__cplusplus")
164+
yield self._cpp_macro
165+
152166
#
153167
# Generate extension modules
154168
#
@@ -516,8 +530,7 @@ def _process_headers(
516530
# https://github.com/pkgconf/pkgconf/issues/391
517531
header2dat_args += ["-I", sysconfig.get_path("include")]
518532

519-
# TODO
520-
header2dat_args += ["-D", "__cplusplus 201703L"]
533+
header2dat_args += ["--cpp", self._cpp_macro]
521534

522535
header2dat_args.append(yml)
523536
header2dat_args.append(yml_input)

0 commit comments

Comments
 (0)