blob: ab5bcef0ef28743bc12014343c93f02cb91c20cd [file] [log] [blame]
# Copyright © 2022 Collabora, Ltd.
# SPDX-License-Identifier: MIT
nak_rust_args = [
'-Aclippy::identity_op',
'-Aclippy::len_zero',
'-Aclippy::manual_range_contains',
# normally this is a good one, but we use it where the "better" code is worse
'-Aclippy::needless_range_loop',
'-Aclippy::redundant_field_names',
'-Aclippy::upper_case_acronyms',
'-Aclippy::vec_box',
'-Aclippy::write_with_newline',
# warns about public function might dereference a raw pointer, but nothing is
# actually public here
'-Aclippy::not_unsafe_ptr_arg_deref',
'-Anon_snake_case',
]
dep_paste = dependency('paste',
version : '>= 1.0.14',
fallback : ['paste', 'dep_paste'],
required : true,
)
libnak_c_files = files(
'nak.h',
'nak_nir.c',
'nak_nir_lower_cf.c',
'nak_nir_lower_fs_inputs.c',
'nak_nir_lower_gs_intrinsics.c',
'nak_nir_lower_non_uniform_ldcx.c',
'nak_nir_lower_scan_reduce.c',
'nak_nir_lower_tex.c',
'nak_nir_lower_vtg_io.c',
'nak_nir_split_64bit_conversions.c',
'nak_memstream.c',
)
_libacorn_rs = static_library(
'acorn',
files('acorn/lib.rs'),
gnu_symbol_visibility : 'hidden',
rust_abi : 'rust',
rust_args : nak_rust_args,
)
idep_acorn_rs = declare_dependency(
link_with : _libacorn_rs,
)
_libbitview_rs = static_library(
'bitview',
files('bitview/lib.rs'),
gnu_symbol_visibility : 'hidden',
rust_abi : 'rust',
rust_args : nak_rust_args,
)
idep_bitview_rs = declare_dependency(
link_with : _libbitview_rs,
)
libnak_deps = [
idep_mesautil,
idep_nir_headers,
idep_nvidia_headers,
]
_nak_bindings_rs = rust.bindgen(
input : ['nak_bindings.h'],
output : 'nak_bindings.rs',
c_args : [
pre_args,
],
args : [
compiler_rs_bindgen_blocklist,
'--raw-line', '#![allow(non_camel_case_types)]',
'--raw-line', '#![allow(non_snake_case)]',
'--raw-line', '#![allow(non_upper_case_globals)]',
'--raw-line', 'use compiler::bindings::*;',
'--allowlist-type', 'drm.*',
'--allowlist-type', 'nak_.*',
'--allowlist-type', 'nouveau_ws_.*',
'--allowlist-var', 'DRM_.*',
'--allowlist-var', 'NVIDIA_VENDOR_ID',
'--allowlist-function', 'drm.*',
'--allowlist-function', 'nak_.*',
'--allowlist-function', 'nouveau_ws_.*',
'--no-prepend-enum-name',
],
dependencies : [
dep_libdrm,
idep_nouveau_ws,
libnak_deps,
],
)
_libnak_bindings_rs = static_library(
'nak_bindings',
_nak_bindings_rs,
gnu_symbol_visibility : 'hidden',
dependencies : [
idep_compiler_rs,
],
rust_abi : 'rust',
)
_libnak_ir_proc_rs = rust.proc_macro(
'nak_ir_proc',
files('nak/ir_proc.rs'),
dependencies : [idep_compiler_proc_rs],
)
_libnak_rs = static_library(
'nak_rs',
files('nak/lib.rs'),
gnu_symbol_visibility : 'hidden',
rust_abi : 'c',
rust_args : [
nak_rust_args,
# Otherwise, rustc trips up on -pthread
'-Clink-arg=-Wno-unused-command-line-argument',
],
dependencies : [
dep_paste,
idep_compiler_rs,
idep_nvidia_headers_rs,
],
link_with : [
_libbitview_rs,
_libnak_bindings_rs,
_libnak_ir_proc_rs,
],
)
# TODO: Linking Rust executables (such as unit tests) doesn't play nicely
# with the sanitizers because meson doesn't know to pass -fsanitize to the
# Rust linker. See also https://github.com/mesonbuild/meson/issues/11741
if with_tests and get_option('b_sanitize') == 'none'
rust.test(
'nak',
_libnak_rs,
args : [
# Don't run HW tests by default
'--skip', 'hw_tests::',
],
suite : ['nouveau'],
dependencies : [
dep_libdrm,
idep_nouveau_ws,
idep_compiler.partial_dependency(link_args : true, links : true),
idep_mesautil.partial_dependency(link_args : true, links : true),
idep_nv_push_rs,
],
# This is needed to ensure we link against glibc
# See also https://gitlab.freedesktop.org/mesa/mesa/-/issues/11632
rust_args: ['-C', 'default-linker-libraries'],
link_with: [
_libacorn_rs,
],
)
endif
nak_nir_algebraic_c = custom_target(
'nak_nir_algebraic.c',
input : 'nak_nir_algebraic.py',
output : 'nak_nir_algebraic.c',
command : [
prog_python, '@INPUT@',
'-p', dir_compiler_nir,
'--out', '@OUTPUT@',
],
depend_files : nir_algebraic_depends,
)
_libnak = static_library(
'nak',
[libnak_c_files, nak_nir_algebraic_c],
include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium],
dependencies : libnak_deps,
link_with : [_libnak_rs],
c_args : [no_override_init_args],
gnu_symbol_visibility : 'hidden',
)
idep_nak = declare_dependency(
include_directories : include_directories('.'),
link_with : _libnak,
)