rust: clean up inputs and outputs to bindgen

Make the handling of bindgen inputs consistent with the inputs and outputs of
source_strings_to_files.

However, for the first source argument reject anything that cannot
possibly be an header file.  This also fixes a mypy failure from the next
patch, since ExtractedObjects does not have a zero-argument get_outputs
method.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
pull/9667/head
Paolo Bonzini 3 years ago committed by Nirbheek Chauhan
parent f8a4e2a591
commit 457156c1b6
  1. 10
      mesonbuild/modules/unstable_rust.py
  2. 20
      test cases/failing/115 nonsensical bindgen/meson.build
  3. 8
      test cases/failing/115 nonsensical bindgen/src/header.h
  4. 8
      test cases/failing/115 nonsensical bindgen/src/source.c
  5. 8
      test cases/failing/115 nonsensical bindgen/test.json

@ -17,7 +17,7 @@ import typing as T
from . import ExtensionModule, ModuleReturnValue from . import ExtensionModule, ModuleReturnValue
from .. import mlog from .. import mlog
from ..build import BothLibraries, BuildTarget, CustomTargetIndex, Executable, GeneratedList, IncludeDirs, CustomTarget from ..build import BothLibraries, BuildTarget, CustomTargetIndex, Executable, ExtractedObjects, GeneratedList, IncludeDirs, CustomTarget
from ..dependencies import Dependency, ExternalLibrary from ..dependencies import Dependency, ExternalLibrary
from ..interpreter.interpreter import TEST_KWARGS from ..interpreter.interpreter import TEST_KWARGS
from ..interpreterbase import ContainerTypeInfo, InterpreterException, KwargInfo, FeatureNew, typed_kwargs, typed_pos_args, noPosargs from ..interpreterbase import ContainerTypeInfo, InterpreterException, KwargInfo, FeatureNew, typed_kwargs, typed_pos_args, noPosargs
@ -27,7 +27,7 @@ if T.TYPE_CHECKING:
from . import ModuleState from . import ModuleState
from ..interpreter import Interpreter from ..interpreter import Interpreter
from ..interpreter import kwargs as _kwargs from ..interpreter import kwargs as _kwargs
from ..interpreter.interpreter import SourceInputs from ..interpreter.interpreter import SourceInputs, SourceOutputs
from ..programs import ExternalProgram from ..programs import ExternalProgram
from typing_extensions import TypedDict from typing_extensions import TypedDict
@ -168,7 +168,7 @@ class RustModule(ExtensionModule):
KwargInfo('include_directories', ContainerTypeInfo(list, IncludeDirs), default=[], listify=True), KwargInfo('include_directories', ContainerTypeInfo(list, IncludeDirs), default=[], listify=True),
KwargInfo( KwargInfo(
'input', 'input',
ContainerTypeInfo(list, (File, GeneratedList, BuildTarget, BothLibraries, CustomTargetIndex, CustomTarget, str), allow_empty=False), ContainerTypeInfo(list, (File, GeneratedList, BuildTarget, BothLibraries, ExtractedObjects, CustomTargetIndex, CustomTarget, str), allow_empty=False),
default=[], default=[],
listify=True, listify=True,
required=True, required=True,
@ -184,7 +184,7 @@ class RustModule(ExtensionModule):
header, *_deps = self.interpreter.source_strings_to_files(kwargs['input']) header, *_deps = self.interpreter.source_strings_to_files(kwargs['input'])
# Split File and Target dependencies to add pass to CustomTarget # Split File and Target dependencies to add pass to CustomTarget
depends: T.List[T.Union[GeneratedList, BuildTarget, CustomTargetIndex, CustomTarget]] = [] depends: T.List['SourceOutputs'] = []
depend_files: T.List[File] = [] depend_files: T.List[File] = []
for d in _deps: for d in _deps:
if isinstance(d, File): if isinstance(d, File):
@ -203,6 +203,8 @@ class RustModule(ExtensionModule):
name: str name: str
if isinstance(header, File): if isinstance(header, File):
name = header.fname name = header.fname
elif isinstance(header, (BuildTarget, BothLibraries, ExtractedObjects)):
raise InterpreterException('bindgen source file must be a C header, not an object or build target')
else: else:
name = header.get_outputs()[0] name = header.get_outputs()[0]

@ -0,0 +1,20 @@
# SPDX-license-identifer: Apache-2.0
# Copyright © 2021 Intel Corporation
project('rustmod bindgen', 'c')
if not add_languages('rust', required: false)
error('MESON_SKIP_TEST test requires rust compiler')
endif
prog_bindgen = find_program('bindgen', required : false)
if not prog_bindgen.found()
error('MESON_SKIP_TEST bindgen not found')
endif
c_lib = static_library('clib', 'src/source.c')
import('unstable-rust').bindgen(
input : c_lib,
output : 'header.rs',
)

@ -0,0 +1,8 @@
// SPDX-license-identifer: Apache-2.0
// Copyright © 2021 Intel Corporation
#pragma once
#include <stdint.h>
int32_t add(const int32_t, const int32_t);

@ -0,0 +1,8 @@
// SPDX-license-identifer: Apache-2.0
// Copyright © 2021 Intel Corporation
#include "header.h"
int32_t add(const int32_t first, const int32_t second) {
return first + second;
}

@ -0,0 +1,8 @@
{
"stdout": [
{
"line": "test cases/failing/115 nonsensical bindgen/meson.build:17:24: ERROR: bindgen source file must be a C header, not an object or build target"
}
]
}
Loading…
Cancel
Save