| rust = import('unstable-rust') | |
| hb_rs = rust.bindgen( | |
| input : '../hb.h', | |
| output : 'hb.rs', | |
| include_directories: incsrc, | |
| args : ['--allowlist-function=hb_.*', | |
| '--allowlist-type=hb_.*', | |
| '--no-copy=hb_.*', | |
| ], | |
| ) | |
| cargo = find_program('cargo') | |
| rustfmt = find_program('rustfmt') | |
| rust_flags = '' | |
| cargo_args = [ | |
| '--package', 'harfbuzz_rust', | |
| '--lib', | |
| '--target-dir', meson.current_build_dir(), | |
| '--manifest-path', meson.current_source_dir() / 'Cargo.toml', | |
| ] | |
| features = [] | |
| if conf.get('HAVE_FONTATIONS', 0) == 1 | |
| features += ['font'] | |
| endif | |
| if conf.get('HAVE_HARFRUST', 0) == 1 | |
| features += ['shape'] | |
| endif | |
| if features.length() > 0 | |
| cargo_args += ['--features', ','.join(features)] | |
| endif | |
| buildtype = get_option('buildtype') | |
| if buildtype == 'release' or buildtype == 'debugoptimized' | |
| cargo_args += [ | |
| '-Z', 'build-std=std,panic_abort', | |
| '-Z', 'build-std-features=optimize_for_size', | |
| ] | |
| cargo_args += ['--profile', buildtype] | |
| endif | |
| opt_level = get_option('optimization') | |
| rust_flags += ' -C force-frame-pointers=yes -C force-unwind-tables=no -C opt-level=' + opt_level | |
| sources = [ | |
| 'lib.rs', | |
| 'font.rs', | |
| 'shape.rs', | |
| ] | |
| harfbuzz_rust = custom_target( | |
| 'harfbuzz_rust', | |
| input: sources + ['Cargo.toml'], | |
| output: ['libharfbuzz_rust.a'], | |
| depends: [hb_rs], | |
| build_always_stale: true, | |
| env: ['OUT_DIR=' + meson.current_build_dir(), | |
| 'RUSTFLAGS=' + rust_flags, | |
| ], | |
| command: [ | |
| cargo, 'build', | |
| ] + cargo_args + [ | |
| '-Z', 'unstable-options', | |
| '--artifact-dir', meson.current_build_dir(), | |
| ], | |
| install: true, | |
| install_dir: join_paths(get_option('prefix'), 'lib'), | |
| ) | |
| harfbuzz_rust_dep = declare_dependency( | |
| link_with: harfbuzz_rust, | |
| ) | |
| clippy_fix = run_target( | |
| 'clippy-fix', | |
| env: ['OUT_DIR=' + meson.current_build_dir()], | |
| depends: [hb_rs, harfbuzz_rust], | |
| command: [ | |
| cargo, 'clippy', | |
| ] + cargo_args + [ | |
| '--allow-dirty', '--fix', | |
| ], | |
| ) | |
| if get_option('tests').enabled() and cargo.found() | |
| test( | |
| 'clippy', | |
| cargo, | |
| env: ['OUT_DIR=' + meson.current_build_dir()], | |
| depends: [hb_rs, harfbuzz_rust], | |
| args: [ | |
| 'clippy', | |
| ] + cargo_args + [ | |
| '--', '-D', 'warnings', | |
| ], | |
| timeout: 300, | |
| ) | |
| endif | |
| # Convert source files in their src dir by transforming the `sources` list. | |
| sources_in_source_dir = [] | |
| foreach s : sources | |
| sources_in_source_dir += meson.current_source_dir() / s | |
| endforeach | |
| rustfmt_fix = run_target( | |
| 'rustfmt-fix', | |
| env: ['OUT_DIR=' + meson.current_build_dir()], | |
| depends: [hb_rs], | |
| command: [ | |
| rustfmt, | |
| '--edition', '2021', | |
| '--', | |
| sources_in_source_dir, | |
| ], | |
| ) | |
| if get_option('tests').enabled() and rustfmt.found() | |
| test( | |
| 'rustfmt', | |
| rustfmt, | |
| env: ['OUT_DIR=' + meson.current_build_dir()], | |
| depends: [hb_rs], | |
| args: [ | |
| '--check', | |
| '--edition', '2021', | |
| '--', | |
| sources_in_source_dir, | |
| ], | |
| ) | |
| endif |