Skip to content
This repository was archived by the owner on Jan 29, 2026. It is now read-only.

Commit 4e64a00

Browse files
committed
build: make meson use common doctest extract logic
1 parent 8de73b7 commit 4e64a00

4 files changed

Lines changed: 47 additions & 68 deletions

File tree

docs/meson.build

Lines changed: 23 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
fs = import('fs')
2-
31
maybe_fmt_dep = dependency(
42
'fmt',
53
version: fmt_spec,
@@ -84,73 +82,31 @@ install_data(
8482
examples = []
8583

8684
foreach doc : docs
87-
code = ''
8885
deps = [msft_proxy4_dep]
89-
90-
state = 0
91-
lines = fs.read(doc).splitlines()
92-
foreach line : lines
93-
if state == 0
94-
if line.contains('## Example')
95-
if code != ''
96-
error(
97-
'File',
98-
doc,
99-
'contains more than one "## Example" C++ code block.',
100-
)
101-
endif
102-
state = 1
103-
endif
104-
elif state == 1
105-
if line == ''
106-
state = 2
107-
else
108-
state = 0
109-
endif
110-
elif state == 2
111-
if line == '```cpp'
112-
state = 3
113-
else
114-
state = 0
115-
endif
116-
elif state == 3
117-
if line != '```'
118-
if line.contains('<proxy/proxy_fmt.h>')
119-
deps += maybe_fmt_dep
120-
endif
121-
code += line + '\n'
122-
else
123-
code = code.substring(0, -1)
124-
state = 0
125-
endif
126-
endif
127-
endforeach
128-
if code != ''
129-
cfg = {
130-
'MD_PATH': 'docs' / doc,
131-
'CODE': code,
132-
}
133-
name = doc.replace('/', '_').substring(0, -3)
134-
example_exe = executable(
135-
f'example_@name@',
136-
configure_file(
137-
configuration: cfg,
138-
input: 'example.cpp.in',
139-
output: f'example_@name@.cpp',
140-
),
141-
extra_files: doc,
142-
implicit_include_directories: false,
143-
dependencies: deps,
144-
build_by_default: false,
145-
)
146-
examples += example_exe
147-
test(
148-
name,
149-
example_exe,
150-
suite: 'ProxyExamples',
151-
depends: autogen_glob,
152-
)
86+
if doc.contains('fmt')
87+
deps += maybe_fmt_dep
15388
endif
89+
90+
name = doc.replace('/', '_').substring(0, -3)
91+
example_exe = executable(
92+
f'example_@name@',
93+
custom_target(
94+
command: [extract_doctest_exe, '@INPUT@', '@OUTPUT@'],
95+
input: doc,
96+
output: f'@name@.cpp',
97+
),
98+
extra_files: doc,
99+
implicit_include_directories: false,
100+
dependencies: deps,
101+
build_by_default: false,
102+
)
103+
examples += example_exe
104+
test(
105+
name,
106+
example_exe,
107+
suite: 'ProxyExamples',
108+
depends: autogen_glob,
109+
)
154110
endforeach
155111

156112
alias_target('examples', examples)

tools/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
autogen_tests_exe = find_program('./meson_autogen_tests.py')
22
autogen_doctest_exe = find_program('./meson_autogen_doctest.py')
33
autogen_benchmarks_exe = find_program('./meson_autogen_benchmarks.py')
4+
extract_doctest_exe = find_program('./meson_extract_doctest.py')

tools/meson_autogen_doctest.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@
2626
if begin == -1 or end == -1:
2727
raise ValueError
2828

29-
docs = [str(path.relative_to(directory).as_posix()) for path in directory.glob("**/*.md") if extract_cpp_code(path) is not None]
29+
docs = [
30+
str(path.relative_to(directory).as_posix())
31+
for path in directory.glob("**/*.md")
32+
if extract_cpp_code(path) is not None
33+
]
3034

3135
config = mformat.get_meson_format([mesonfile])
3236
formatter = mformat.Formatter(config, False, False)

tools/meson_extract_doctest.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/usr/bin/env python3
2+
# pyright: strict
3+
4+
import sys
5+
from pathlib import Path
6+
7+
from extract_example_code_from_docs import extract_cpp_code
8+
9+
infile = Path(sys.argv[1])
10+
outfile = Path(sys.argv[2])
11+
12+
cpp_code = extract_cpp_code(infile)
13+
14+
if not cpp_code:
15+
raise ValueError
16+
17+
with open(outfile, "w") as f:
18+
_ = f.write(cpp_code)

0 commit comments

Comments
 (0)