1#![allow(non_camel_case_types)]
32#![allow(clippy::missing_safety_doc)]
33
34use std::ffi::{c_char, c_int, c_void};
35use std::sync::OnceLock;
36
37pub enum ShadercCompiler {}
42pub enum ShadercCompileOptions {}
43pub enum ShadercCompilationResult {}
44
45#[repr(C)]
50pub struct shaderc_include_result {
51 pub source_name: *const c_char,
52 pub source_name_length: usize,
53 pub content: *const c_char,
54 pub content_length: usize,
55 pub user_data: *mut c_void,
56}
57
58pub type shaderc_include_resolve_fn = extern "C" fn(
59 user_data: *mut c_void,
60 requested_source: *const c_char,
61 type_: c_int,
62 requesting_source: *const c_char,
63 include_depth: usize,
64) -> *mut shaderc_include_result;
65
66pub type shaderc_include_result_release_fn =
67 extern "C" fn(user_data: *mut c_void, include_result: *mut shaderc_include_result);
68
69struct ShadercLibrary {
74 _lib: libloading::Library,
75 fns: ShadercFunctions,
76}
77
78struct ShadercFunctions {
80 compiler_initialize: unsafe extern "C" fn() -> *mut ShadercCompiler,
82 compiler_release: unsafe extern "C" fn(*mut ShadercCompiler),
83
84 compile_into_spv: unsafe extern "C" fn(
86 *const ShadercCompiler,
87 *const c_char,
88 usize,
89 i32,
90 *const c_char,
91 *const c_char,
92 *const ShadercCompileOptions,
93 ) -> *mut ShadercCompilationResult,
94 compile_into_spv_assembly: unsafe extern "C" fn(
95 *const ShadercCompiler,
96 *const c_char,
97 usize,
98 i32,
99 *const c_char,
100 *const c_char,
101 *const ShadercCompileOptions,
102 ) -> *mut ShadercCompilationResult,
103 compile_into_preprocessed_text: unsafe extern "C" fn(
104 *const ShadercCompiler,
105 *const c_char,
106 usize,
107 i32,
108 *const c_char,
109 *const c_char,
110 *const ShadercCompileOptions,
111 ) -> *mut ShadercCompilationResult,
112 assemble_into_spv: unsafe extern "C" fn(
113 *const ShadercCompiler,
114 *const c_char,
115 usize,
116 *const ShadercCompileOptions,
117 ) -> *mut ShadercCompilationResult,
118
119 compile_options_initialize: unsafe extern "C" fn() -> *mut ShadercCompileOptions,
121 compile_options_clone:
122 unsafe extern "C" fn(*const ShadercCompileOptions) -> *mut ShadercCompileOptions,
123 compile_options_release: unsafe extern "C" fn(*mut ShadercCompileOptions),
124 compile_options_add_macro_definition: unsafe extern "C" fn(
125 *mut ShadercCompileOptions,
126 *const c_char,
127 usize,
128 *const c_char,
129 usize,
130 ),
131 compile_options_set_source_language: unsafe extern "C" fn(*mut ShadercCompileOptions, i32),
132 compile_options_set_generate_debug_info: unsafe extern "C" fn(*mut ShadercCompileOptions),
133 compile_options_set_optimization_level: unsafe extern "C" fn(*mut ShadercCompileOptions, i32),
134 compile_options_set_forced_version_profile:
135 unsafe extern "C" fn(*mut ShadercCompileOptions, c_int, i32),
136 compile_options_set_include_callbacks: unsafe extern "C" fn(
137 *mut ShadercCompileOptions,
138 shaderc_include_resolve_fn,
139 shaderc_include_result_release_fn,
140 *mut c_void,
141 ),
142 compile_options_set_suppress_warnings: unsafe extern "C" fn(*mut ShadercCompileOptions),
143 compile_options_set_warnings_as_errors: unsafe extern "C" fn(*mut ShadercCompileOptions),
144 compile_options_set_target_env: unsafe extern "C" fn(*mut ShadercCompileOptions, i32, u32),
145 compile_options_set_target_spirv: unsafe extern "C" fn(*mut ShadercCompileOptions, i32),
146 compile_options_set_limit: unsafe extern "C" fn(*mut ShadercCompileOptions, i32, c_int),
147 compile_options_set_auto_bind_uniforms: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
148 compile_options_set_auto_combined_image_sampler:
149 unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
150 compile_options_set_hlsl_io_mapping: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
151 compile_options_set_hlsl_offsets: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
152 compile_options_set_binding_base: unsafe extern "C" fn(*mut ShadercCompileOptions, c_int, u32),
153 compile_options_set_binding_base_for_stage:
154 unsafe extern "C" fn(*mut ShadercCompileOptions, c_int, c_int, u32),
155 compile_options_set_hlsl_register_set_and_binding: unsafe extern "C" fn(
156 *mut ShadercCompileOptions,
157 *const c_char,
158 *const c_char,
159 *const c_char,
160 ),
161 compile_options_set_auto_map_locations: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
162 compile_options_set_hlsl_register_set_and_binding_for_stage: unsafe extern "C" fn(
163 *mut ShadercCompileOptions,
164 c_int,
165 *const c_char,
166 *const c_char,
167 *const c_char,
168 ),
169 compile_options_set_hlsl_functionality1: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
170 compile_options_set_invert_y: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
171 compile_options_set_nan_clamp: unsafe extern "C" fn(*mut ShadercCompileOptions, bool),
172
173 result_release: unsafe extern "C" fn(*mut ShadercCompilationResult),
175 result_get_compilation_status: unsafe extern "C" fn(*const ShadercCompilationResult) -> i32,
176 result_get_num_errors: unsafe extern "C" fn(*const ShadercCompilationResult) -> usize,
177 result_get_num_warnings: unsafe extern "C" fn(*const ShadercCompilationResult) -> usize,
178 result_get_error_message:
179 unsafe extern "C" fn(*const ShadercCompilationResult) -> *const c_char,
180 result_get_length: unsafe extern "C" fn(*const ShadercCompilationResult) -> usize,
181 result_get_bytes: unsafe extern "C" fn(*const ShadercCompilationResult) -> *const c_char,
182
183 get_spv_version: unsafe extern "C" fn(*mut c_int, *mut c_int),
185 parse_version_profile: unsafe extern "C" fn(*const c_char, *mut c_int, *mut i32) -> bool,
186}
187
188fn load_library() -> Option<ShadercLibrary> {
190 let lib_name = if let Ok(path) = std::env::var("SHADERC_LIB_PATH") {
191 path
192 } else if cfg!(target_os = "windows") {
193 "shaderc_shared.dll".to_owned()
194 } else if cfg!(target_os = "macos") {
195 "libshaderc_shared.dylib".to_owned()
196 } else {
197 "libshaderc_shared.so".to_owned()
198 };
199
200 let lib = unsafe { libloading::Library::new(&lib_name) }.ok()?;
201
202 macro_rules! load {
204 ($lib:expr, $name:literal) => {
205 *unsafe { $lib.get::<_>($name) }.ok()?
206 };
207 }
208
209 let fns = ShadercFunctions {
210 compiler_initialize: load!(lib, b"shaderc_compiler_initialize\0"),
211 compiler_release: load!(lib, b"shaderc_compiler_release\0"),
212 compile_into_spv: load!(lib, b"shaderc_compile_into_spv\0"),
213 compile_into_spv_assembly: load!(lib, b"shaderc_compile_into_spv_assembly\0"),
214 compile_into_preprocessed_text: load!(lib, b"shaderc_compile_into_preprocessed_text\0"),
215 assemble_into_spv: load!(lib, b"shaderc_assemble_into_spv\0"),
216 compile_options_initialize: load!(lib, b"shaderc_compile_options_initialize\0"),
217 compile_options_clone: load!(lib, b"shaderc_compile_options_clone\0"),
218 compile_options_release: load!(lib, b"shaderc_compile_options_release\0"),
219 compile_options_add_macro_definition: load!(
220 lib,
221 b"shaderc_compile_options_add_macro_definition\0"
222 ),
223 compile_options_set_source_language: load!(
224 lib,
225 b"shaderc_compile_options_set_source_language\0"
226 ),
227 compile_options_set_generate_debug_info: load!(
228 lib,
229 b"shaderc_compile_options_set_generate_debug_info\0"
230 ),
231 compile_options_set_optimization_level: load!(
232 lib,
233 b"shaderc_compile_options_set_optimization_level\0"
234 ),
235 compile_options_set_forced_version_profile: load!(
236 lib,
237 b"shaderc_compile_options_set_forced_version_profile\0"
238 ),
239 compile_options_set_include_callbacks: load!(
240 lib,
241 b"shaderc_compile_options_set_include_callbacks\0"
242 ),
243 compile_options_set_suppress_warnings: load!(
244 lib,
245 b"shaderc_compile_options_set_suppress_warnings\0"
246 ),
247 compile_options_set_warnings_as_errors: load!(
248 lib,
249 b"shaderc_compile_options_set_warnings_as_errors\0"
250 ),
251 compile_options_set_target_env: load!(lib, b"shaderc_compile_options_set_target_env\0"),
252 compile_options_set_target_spirv: load!(lib, b"shaderc_compile_options_set_target_spirv\0"),
253 compile_options_set_limit: load!(lib, b"shaderc_compile_options_set_limit\0"),
254 compile_options_set_auto_bind_uniforms: load!(
255 lib,
256 b"shaderc_compile_options_set_auto_bind_uniforms\0"
257 ),
258 compile_options_set_auto_combined_image_sampler: load!(
259 lib,
260 b"shaderc_compile_options_set_auto_combined_image_sampler\0"
261 ),
262 compile_options_set_hlsl_io_mapping: load!(
263 lib,
264 b"shaderc_compile_options_set_hlsl_io_mapping\0"
265 ),
266 compile_options_set_hlsl_offsets: load!(lib, b"shaderc_compile_options_set_hlsl_offsets\0"),
267 compile_options_set_binding_base: load!(lib, b"shaderc_compile_options_set_binding_base\0"),
268 compile_options_set_binding_base_for_stage: load!(
269 lib,
270 b"shaderc_compile_options_set_binding_base_for_stage\0"
271 ),
272 compile_options_set_hlsl_register_set_and_binding: load!(
273 lib,
274 b"shaderc_compile_options_set_hlsl_register_set_and_binding\0"
275 ),
276 compile_options_set_auto_map_locations: load!(
277 lib,
278 b"shaderc_compile_options_set_auto_map_locations\0"
279 ),
280 compile_options_set_hlsl_register_set_and_binding_for_stage: load!(
281 lib,
282 b"shaderc_compile_options_set_hlsl_register_set_and_binding_for_stage\0"
283 ),
284 compile_options_set_hlsl_functionality1: load!(
285 lib,
286 b"shaderc_compile_options_set_hlsl_functionality1\0"
287 ),
288 compile_options_set_invert_y: load!(lib, b"shaderc_compile_options_set_invert_y\0"),
289 compile_options_set_nan_clamp: load!(lib, b"shaderc_compile_options_set_nan_clamp\0"),
290 result_release: load!(lib, b"shaderc_result_release\0"),
291 result_get_compilation_status: load!(lib, b"shaderc_result_get_compilation_status\0"),
292 result_get_num_errors: load!(lib, b"shaderc_result_get_num_errors\0"),
293 result_get_num_warnings: load!(lib, b"shaderc_result_get_num_warnings\0"),
294 result_get_error_message: load!(lib, b"shaderc_result_get_error_message\0"),
295 result_get_length: load!(lib, b"shaderc_result_get_length\0"),
296 result_get_bytes: load!(lib, b"shaderc_result_get_bytes\0"),
297 get_spv_version: load!(lib, b"shaderc_get_spv_version\0"),
298 parse_version_profile: load!(lib, b"shaderc_parse_version_profile\0"),
299 };
300
301 Some(ShadercLibrary { _lib: lib, fns })
302}
303
304static LIB: OnceLock<Option<ShadercLibrary>> = OnceLock::new();
305
306fn lib() -> Option<&'static ShadercLibrary> {
307 LIB.get_or_init(load_library).as_ref()
308}
309
310fn expect_lib() -> &'static ShadercLibrary {
311 lib().expect(
312 "shaderc shared library not loaded. \
313 Install libshaderc_shared (via Vulkan SDK, `brew install shaderc`, \
314 or `apt install libshaderc-dev`) and ensure it is on the library search path, \
315 or set SHADERC_LIB_PATH to the full path of the shared library.",
316 )
317}
318
319pub unsafe fn shaderc_compiler_initialize() -> *mut ShadercCompiler {
326 match lib() {
327 Some(l) => unsafe { (l.fns.compiler_initialize)() },
328 None => std::ptr::null_mut(),
329 }
330}
331
332pub unsafe fn shaderc_compiler_release(compiler: *mut ShadercCompiler) {
333 unsafe { (expect_lib().fns.compiler_release)(compiler) };
334}
335
336pub unsafe fn shaderc_compile_into_spv(
339 compiler: *const ShadercCompiler,
340 source_text: *const c_char,
341 source_size: usize,
342 shader_kind: i32,
343 input_file_name: *const c_char,
344 entry_point_name: *const c_char,
345 additional_options: *const ShadercCompileOptions,
346) -> *mut ShadercCompilationResult {
347 unsafe {
348 (expect_lib().fns.compile_into_spv)(
349 compiler,
350 source_text,
351 source_size,
352 shader_kind,
353 input_file_name,
354 entry_point_name,
355 additional_options,
356 )
357 }
358}
359
360pub unsafe fn shaderc_compile_into_spv_assembly(
361 compiler: *const ShadercCompiler,
362 source_text: *const c_char,
363 source_size: usize,
364 shader_kind: i32,
365 input_file_name: *const c_char,
366 entry_point_name: *const c_char,
367 additional_options: *const ShadercCompileOptions,
368) -> *mut ShadercCompilationResult {
369 unsafe {
370 (expect_lib().fns.compile_into_spv_assembly)(
371 compiler,
372 source_text,
373 source_size,
374 shader_kind,
375 input_file_name,
376 entry_point_name,
377 additional_options,
378 )
379 }
380}
381
382pub unsafe fn shaderc_compile_into_preprocessed_text(
383 compiler: *const ShadercCompiler,
384 source_text: *const c_char,
385 source_size: usize,
386 shader_kind: i32,
387 input_file_name: *const c_char,
388 entry_point_name: *const c_char,
389 additional_options: *const ShadercCompileOptions,
390) -> *mut ShadercCompilationResult {
391 unsafe {
392 (expect_lib().fns.compile_into_preprocessed_text)(
393 compiler,
394 source_text,
395 source_size,
396 shader_kind,
397 input_file_name,
398 entry_point_name,
399 additional_options,
400 )
401 }
402}
403
404pub unsafe fn shaderc_assemble_into_spv(
405 compiler: *const ShadercCompiler,
406 source_assembly: *const c_char,
407 source_size: usize,
408 additional_options: *const ShadercCompileOptions,
409) -> *mut ShadercCompilationResult {
410 unsafe {
411 (expect_lib().fns.assemble_into_spv)(
412 compiler,
413 source_assembly,
414 source_size,
415 additional_options,
416 )
417 }
418}
419
420pub unsafe fn shaderc_compile_options_initialize() -> *mut ShadercCompileOptions {
423 match lib() {
424 Some(l) => unsafe { (l.fns.compile_options_initialize)() },
425 None => std::ptr::null_mut(),
426 }
427}
428
429pub unsafe fn shaderc_compile_options_clone(
430 options: *const ShadercCompileOptions,
431) -> *mut ShadercCompileOptions {
432 match lib() {
433 Some(l) => unsafe { (l.fns.compile_options_clone)(options) },
434 None => std::ptr::null_mut(),
435 }
436}
437
438pub unsafe fn shaderc_compile_options_release(options: *mut ShadercCompileOptions) {
439 unsafe { (expect_lib().fns.compile_options_release)(options) };
440}
441
442pub unsafe fn shaderc_compile_options_add_macro_definition(
443 options: *mut ShadercCompileOptions,
444 name: *const c_char,
445 name_length: usize,
446 value: *const c_char,
447 value_length: usize,
448) {
449 unsafe {
450 (expect_lib().fns.compile_options_add_macro_definition)(
451 options,
452 name,
453 name_length,
454 value,
455 value_length,
456 )
457 };
458}
459
460pub unsafe fn shaderc_compile_options_set_source_language(
461 options: *mut ShadercCompileOptions,
462 language: i32,
463) {
464 unsafe { (expect_lib().fns.compile_options_set_source_language)(options, language) };
465}
466
467pub unsafe fn shaderc_compile_options_set_generate_debug_info(options: *mut ShadercCompileOptions) {
468 unsafe { (expect_lib().fns.compile_options_set_generate_debug_info)(options) };
469}
470
471pub unsafe fn shaderc_compile_options_set_optimization_level(
472 options: *mut ShadercCompileOptions,
473 level: i32,
474) {
475 unsafe { (expect_lib().fns.compile_options_set_optimization_level)(options, level) };
476}
477
478pub unsafe fn shaderc_compile_options_set_forced_version_profile(
479 options: *mut ShadercCompileOptions,
480 version: c_int,
481 profile: i32,
482) {
483 unsafe {
484 (expect_lib().fns.compile_options_set_forced_version_profile)(options, version, profile)
485 };
486}
487
488pub unsafe fn shaderc_compile_options_set_include_callbacks(
489 options: *mut ShadercCompileOptions,
490 resolver: shaderc_include_resolve_fn,
491 result_releaser: shaderc_include_result_release_fn,
492 user_data: *mut c_void,
493) {
494 unsafe {
495 (expect_lib().fns.compile_options_set_include_callbacks)(
496 options,
497 resolver,
498 result_releaser,
499 user_data,
500 )
501 };
502}
503
504pub unsafe fn shaderc_compile_options_set_suppress_warnings(options: *mut ShadercCompileOptions) {
505 unsafe { (expect_lib().fns.compile_options_set_suppress_warnings)(options) };
506}
507
508pub unsafe fn shaderc_compile_options_set_warnings_as_errors(options: *mut ShadercCompileOptions) {
509 unsafe { (expect_lib().fns.compile_options_set_warnings_as_errors)(options) };
510}
511
512pub unsafe fn shaderc_compile_options_set_target_env(
513 options: *mut ShadercCompileOptions,
514 env: i32,
515 version: u32,
516) {
517 unsafe { (expect_lib().fns.compile_options_set_target_env)(options, env, version) };
518}
519
520pub unsafe fn shaderc_compile_options_set_target_spirv(
521 options: *mut ShadercCompileOptions,
522 version: i32,
523) {
524 unsafe { (expect_lib().fns.compile_options_set_target_spirv)(options, version) };
525}
526
527pub unsafe fn shaderc_compile_options_set_limit(
528 options: *mut ShadercCompileOptions,
529 limit: i32,
530 value: c_int,
531) {
532 unsafe { (expect_lib().fns.compile_options_set_limit)(options, limit, value) };
533}
534
535pub unsafe fn shaderc_compile_options_set_auto_bind_uniforms(
536 options: *mut ShadercCompileOptions,
537 auto_bind: bool,
538) {
539 unsafe { (expect_lib().fns.compile_options_set_auto_bind_uniforms)(options, auto_bind) };
540}
541
542pub unsafe fn shaderc_compile_options_set_auto_combined_image_sampler(
543 options: *mut ShadercCompileOptions,
544 auto_combine: bool,
545) {
546 unsafe {
547 (expect_lib()
548 .fns
549 .compile_options_set_auto_combined_image_sampler)(options, auto_combine)
550 };
551}
552
553pub unsafe fn shaderc_compile_options_set_hlsl_io_mapping(
554 options: *mut ShadercCompileOptions,
555 hlsl_iomap: bool,
556) {
557 unsafe { (expect_lib().fns.compile_options_set_hlsl_io_mapping)(options, hlsl_iomap) };
558}
559
560pub unsafe fn shaderc_compile_options_set_hlsl_offsets(
561 options: *mut ShadercCompileOptions,
562 hlsl_offsets: bool,
563) {
564 unsafe { (expect_lib().fns.compile_options_set_hlsl_offsets)(options, hlsl_offsets) };
565}
566
567pub unsafe fn shaderc_compile_options_set_binding_base(
568 options: *mut ShadercCompileOptions,
569 resource_kind: c_int,
570 base: u32,
571) {
572 unsafe { (expect_lib().fns.compile_options_set_binding_base)(options, resource_kind, base) };
573}
574
575pub unsafe fn shaderc_compile_options_set_binding_base_for_stage(
576 options: *mut ShadercCompileOptions,
577 shader_kind: c_int,
578 resource_kind: c_int,
579 base: u32,
580) {
581 unsafe {
582 (expect_lib().fns.compile_options_set_binding_base_for_stage)(
583 options,
584 shader_kind,
585 resource_kind,
586 base,
587 )
588 };
589}
590
591pub unsafe fn shaderc_compile_options_set_hlsl_register_set_and_binding(
592 options: *mut ShadercCompileOptions,
593 register: *const c_char,
594 set: *const c_char,
595 binding: *const c_char,
596) {
597 unsafe {
598 (expect_lib()
599 .fns
600 .compile_options_set_hlsl_register_set_and_binding)(
601 options, register, set, binding
602 )
603 };
604}
605
606pub unsafe fn shaderc_compile_options_set_auto_map_locations(
607 options: *mut ShadercCompileOptions,
608 auto_map: bool,
609) {
610 unsafe { (expect_lib().fns.compile_options_set_auto_map_locations)(options, auto_map) };
611}
612
613pub unsafe fn shaderc_compile_options_set_hlsl_register_set_and_binding_for_stage(
614 options: *mut ShadercCompileOptions,
615 shader_kind: c_int,
616 register: *const c_char,
617 set: *const c_char,
618 binding: *const c_char,
619) {
620 unsafe {
621 (expect_lib()
622 .fns
623 .compile_options_set_hlsl_register_set_and_binding_for_stage)(
624 options,
625 shader_kind,
626 register,
627 set,
628 binding,
629 )
630 };
631}
632
633pub unsafe fn shaderc_compile_options_set_hlsl_functionality1(
634 options: *mut ShadercCompileOptions,
635 enable: bool,
636) {
637 unsafe { (expect_lib().fns.compile_options_set_hlsl_functionality1)(options, enable) };
638}
639
640pub unsafe fn shaderc_compile_options_set_invert_y(
641 options: *mut ShadercCompileOptions,
642 enable: bool,
643) {
644 unsafe { (expect_lib().fns.compile_options_set_invert_y)(options, enable) };
645}
646
647pub unsafe fn shaderc_compile_options_set_nan_clamp(
648 options: *mut ShadercCompileOptions,
649 enable: bool,
650) {
651 unsafe { (expect_lib().fns.compile_options_set_nan_clamp)(options, enable) };
652}
653
654pub unsafe fn shaderc_result_release(result: *mut ShadercCompilationResult) {
657 unsafe { (expect_lib().fns.result_release)(result) };
658}
659
660pub unsafe fn shaderc_result_get_compilation_status(
661 result: *const ShadercCompilationResult,
662) -> i32 {
663 unsafe { (expect_lib().fns.result_get_compilation_status)(result) }
664}
665
666pub unsafe fn shaderc_result_get_num_errors(result: *const ShadercCompilationResult) -> usize {
667 unsafe { (expect_lib().fns.result_get_num_errors)(result) }
668}
669
670pub unsafe fn shaderc_result_get_num_warnings(result: *const ShadercCompilationResult) -> usize {
671 unsafe { (expect_lib().fns.result_get_num_warnings)(result) }
672}
673
674pub unsafe fn shaderc_result_get_error_message(
675 result: *const ShadercCompilationResult,
676) -> *const c_char {
677 unsafe { (expect_lib().fns.result_get_error_message)(result) }
678}
679
680pub unsafe fn shaderc_result_get_length(result: *const ShadercCompilationResult) -> usize {
681 unsafe { (expect_lib().fns.result_get_length)(result) }
682}
683
684pub unsafe fn shaderc_result_get_bytes(result: *const ShadercCompilationResult) -> *const c_char {
685 unsafe { (expect_lib().fns.result_get_bytes)(result) }
686}
687
688pub unsafe fn shaderc_get_spv_version(version: *mut c_int, revision: *mut c_int) {
691 unsafe { (expect_lib().fns.get_spv_version)(version, revision) };
692}
693
694pub unsafe fn shaderc_parse_version_profile(
695 str: *const c_char,
696 version: *mut c_int,
697 profile: *mut i32,
698) -> bool {
699 unsafe { (expect_lib().fns.parse_version_profile)(str, version, profile) }
700}