안드로이드 러스트 모듈

일반적인 원칙으로, rust_* 모듈 정의는 cc_* 사용법과 기대치를 밀접하게 따릅니다. 다음은 Rust 바이너리에 대한 모듈 정의의 예입니다:

rust_binary {
    name: "hello_rust",
    crate_name: "hello_rust",
    srcs: ["src/hello_rust.rs"],
    host_supported: true,
}

이 페이지는 rust_* 모듈의 가장 일반적인 속성을 다룹니다. 특정 모듈 유형 및 예제 모듈 정의에 대한 자세한 내용은 바이너리 모듈 , 라이브러리 모듈 또는 테스트 모듈 페이지를 참조하십시오.

기본 모듈 유형

유형 정의 자세한 내용은
rust_binary Rust 바이너리 바이너리 모듈 페이지
rust_library Rust 라이브러리를 생성하고 rlibdylib 변형을 모두 제공합니다. rust_library , 라이브러리 모듈 페이지.
rust_ffi cc 모듈에서 사용할 수 있는 Rust C 라이브러리를 생성하고 정적 및 공유 변형을 모두 제공합니다. rust_ffi , 라이브러리 모듈 페이지
rust_proc_macro proc-macro Rust 라이브러리를 생성합니다. (컴파일러 플러그인과 유사합니다.) rust_proc_macro , 라이브러리 모듈 페이지
rust_test 표준 Rust 테스트 하네스를 사용하는 Rust 테스트 바이너리를 생성합니다. 테스트 모듈 페이지
rust_fuzz libfuzzer 를 활용하여 Rust fuzz 바이너리를 생성합니다. rust_fuzz 모듈 예제
rust_protobuf 소스를 생성하고 특정 protobuf에 대한 인터페이스를 제공하는 Rust 라이브러리를 생성합니다. Protobufs 모듈소스 생성기 페이지
rust_bindgen 소스를 생성하고 C 라이브러리에 대한 Rust 바인딩을 포함하는 Rust 라이브러리를 생성합니다. Bindgen 바인딩 모듈소스 생성기 페이지

중요한 공통 속성

이러한 속성은 모든 Android Rust 모듈에서 공통입니다. 개별 Rust 모듈과 관련된 추가(고유한) 속성은 해당 모듈의 페이지에 나열됩니다.

이름

name 은 모듈의 이름입니다. 다른 Soong 모듈과 마찬가지로 대부분의 Android.bp 모듈 유형에서 고유해야 합니다. 기본적으로 name 은 출력 파일 이름으로 사용됩니다. 출력 파일 이름이 모듈 이름과 달라야 하는 경우 stem 속성을 사용하여 정의합니다.

줄기

stem (선택 사항)는 출력 파일 이름을 직접 제어합니다(파일 확장명 및 기타 접미사 제외). 예를 들어, 스템 값이 libfoorust_library_rlib 라이브러리는 libfoo.rlib 파일을 생성합니다. stem 속성에 값을 제공하지 않으면 출력 파일 이름은 기본적으로 모듈 이름을 채택합니다.

모듈 이름을 원하는 출력 파일 이름으로 설정할 수 없는 경우 stem 함수를 사용하십시오. 예를 들어, rust_library liblog cc_library 가 이미 존재하기 때문에 log 크레이트에 대한 liblog_rust 의 이름은 liblog_rust 입니다. 이 경우에 stem 속성을 사용하면 출력 파일의 이름이 liblog.* 대신 liblog_rust.* 로 지정됩니다.

srcs

srcs 는 모듈(보통 main.rs 또는 lib.rs )에 대한 진입점을 나타내는 단일 소스 파일을 포함합니다. rustc 는 컴파일에 필요한 다른 모든 소스 파일의 확인 및 검색을 처리하고 생성되는 deps 파일에 열거됩니다.

가능하면 플랫폼 코드에 이 사용을 피하십시오. 자세한 내용은 소스 생성기 를 참조하세요.

크레이트 이름

crate_namerustc --crate_name 플래그를 통해 크레이트 이름 메타데이터를 설정합니다. 라이브러리를 생성하는 모듈의 경우 소스에 사용된 예상 크레이트 이름과 일치 해야 합니다 . 예를 들어, libfoo_bar 모듈이 소스에서 extern crate foo_bar 로 참조되는 경우 이것은 crate_name: "foo_bar" 여야 합니다 .

이 속성은 모든 rust_* 모듈에 공통적이지만 Rust 라이브러리를 생성하는 모듈(예: rust_library , rust_ffi , rust_bindgen , rust_protobufrust_proc_macro )에는 필수 입니다. 이 모듈은 crate_name 과 출력 파일 이름 간의 관계에 대해 rustc 요구 사항을 적용합니다. 자세한 내용은 라이브러리 모듈 섹션을 참조하세요.

보푸라기

Rustc linter 는 소스 생성기를 제외한 모든 모듈 유형에 대해 기본적으로 실행됩니다. 일부 린트 세트가 정의되어 모듈 소스의 유효성을 검사하는 데 사용됩니다. 이러한 린트 세트에 가능한 값은 다음과 같습니다.

  • default (모듈의 위치에 따른 기본 린트 세트)
  • android (모든 Android 플랫폼 코드에 적용되는 가장 엄격한 린트 세트의 경우)
  • vendor (공급업체 코드에 적용된 완화된 린트 세트의 경우)
  • none (모든 보푸라기 경고 및 오류 무시용)

clippy_lints

clippy linter 는 또한 소스 생성기를 제외한 모든 모듈 유형에 대해 기본적으로 실행됩니다. 모듈 소스의 유효성을 검사하는 데 사용되는 몇 가지 린트 세트가 정의되어 있습니다. 다음은 가능한 값입니다.

  • default (모듈 위치에 따른 기본 린트 세트)
  • android (모든 Android 플랫폼 코드에 적용되는 가장 엄격한 린트 세트의 경우)
  • vendor (공급업체 코드에 적용된 완화된 린트 세트의 경우)
  • none (모든 보푸라기 경고 및 오류 무시용)

edition 은 이 코드를 컴파일하는 데 사용할 Rust 에디션을 정의합니다. 이것은 C 및 C++의 표준 버전과 유사합니다. 유효한 값은 20152018 (기본값)입니다.

깃발

flags 는 컴파일하는 동안 rustc 에 전달할 플래그의 문자열 목록을 포함합니다.

ld_flags

ld-flags 에는 소스를 컴파일할 때 링커에 전달할 플래그의 문자열 목록이 포함되어 있습니다. 이것들은 -C linker-args rustc 플래그에 의해 전달됩니다. clang 은 실제 연결을 위해 lld 를 호출하는 링커 프런트 엔드로 사용됩니다.

특징

features 은 컴파일 중에 활성화해야 하는 기능의 문자열 목록입니다. 이것은 --cfg 'feature="foo"' 에 전달됩니다. 대부분의 기능은 추가 기능이므로 많은 경우 모든 종속 모듈에 필요한 전체 기능 세트로 구성됩니다. 그러나 기능이 서로 배타적인 경우 충돌하는 기능을 제공하는 빌드 파일에 추가 모듈을 정의하십시오.

cfgs

cfgs 에는 컴파일 중에 활성화될 cfg 플래그의 문자열 목록이 포함되어 있습니다. 이것은 --cfg foo--cfg "fizz=buzz" 에 의해 rustc 에 전달됩니다.

빌드 시스템은 아래 나열된 특정 상황에서 특정 cfg 플래그를 자동으로 설정합니다.

  • dylib로 빌드된 모듈에는 android_dylib cfg가 설정됩니다.
  • VNDK를 사용하는 모듈에는 android_vndk cfg가 설정됩니다. 이것은 C++에 대한 __ANDROID_VNDK__ 정의와 유사합니다.

조각

strip 은 출력 파일을 제거할지 여부와 방법을 제어합니다(해당되는 경우). 이것이 설정되지 않으면 장치 모듈은 기본적으로 미니 디버그 정보를 제외한 모든 것을 제거합니다. 호스트 모듈은 기본적으로 기호를 제거하지 않습니다. 유효한 값에는 제거를 비활성화하는 none 과 미니 디버그 정보를 포함하여 all 것을 제거하는 all이 있습니다. 추가 값은 Soong Modules Reference 에서 찾을 수 있습니다.

호스트_지원

장치 모듈의 경우 host_supported 매개변수는 모듈이 호스트 변형도 제공해야 하는지 여부를 나타냅니다.

라이브러리 종속성 정의

Rust 모듈은 다음 속성을 통해 CC 및 Rust 라이브러리 모두에 의존할 수 있습니다.

속성 이름 설명
rustlibs 종속성이기도 한 rust_library 모듈의 목록입니다. 빌드 시스템이 선호하는 연결을 선택할 수 있도록 하기 때문에 이것을 선호하는 종속성을 선언하는 방법으로 사용하십시오. (아래의 Rust 라이브러리에 연결할 때 참조)
rlibs rlibs 로 정적으로 링크되어야 하는 rust_library 모듈 목록입니다. (주의해서 사용하십시오. 아래의 Rust 라이브러리에 연결할 때 참조)
dylibs dylibs 로 동적으로 링크될 rust_library 모듈의 목록입니다. (주의해서 사용하십시오. 아래의 Rust 라이브러리에 연결할 때 참조)
shared_libs 공유 라이브러리로 동적으로 연결되어야 하는 cc_library 모듈 목록입니다.
static_libs 정적 라이브러리로 정적으로 링크되어야 하는 cc_library 모듈 목록입니다.
whole_static_libs 정적 라이브러리로 정적으로 표시되어야 하고 결과 라이브러리에 전체를 포함해야 하는 cc_library 모듈 목록입니다. rust_ffi_static 변형의 경우 whole_static_libraries 가 결과 정적 라이브러리 아카이브에 포함됩니다. rust_library_rlib 변형의 경우 whole_static_libraries 라이브러리가 결과 rlib 라이브러리에 번들됩니다.

Rust 라이브러리에 연결할 때 특별한 이유가 없는 한 rlibs 또는 dylibs 대신 rustlibs 속성을 사용하는 것이 가장 좋습니다. 이렇게 하면 빌드 시스템이 루트 모듈에 필요한 것을 기반으로 올바른 연결을 선택할 수 있고 종속성 트리에 라이브러리의 rlibdylib 버전이 모두 포함될 가능성이 줄어듭니다(이로 인해 컴파일 실패).

지원되지 않고 제한된 지원 빌드 기능

Soong's Rust는 vendorvendor_ramdisk 이미지 및 스냅샷에 대한 제한된 지원을 제공합니다. 그러나 rlibs , staticlibs , cdylibsbinaries 는 지원됩니다. 공급업체 이미지 빌드 대상의 경우 android_vndk cfg 속성이 설정됩니다. 시스템 대상과 공급업체 대상 간에 차이가 있는 경우 코드에서 이를 사용할 수 있습니다. rust_proc_macros 는 공급업체 스냅샷의 일부로 캡처되지 않습니다. 의존하는 경우 적절하게 버전을 제어해야 합니다.

제품, VNDK 및 복구 이미지는 지원되지 않습니다.

증분 빌드

개발자는 SOONG_RUSTC_INCREMENTAL 환경 변수를 true 로 설정하여 Rust 소스의 증분 컴파일을 활성화할 수 있습니다.

경고 : 이것은 빌드봇에 의해 생성된 것과 동일한 바이너리를 생성한다고 보장되지 않습니다. 목적 파일에 포함된 함수나 데이터의 주소는 다를 수 있습니다. 생성된 아티팩트가 EngProd 인프라에서 구축한 것과 100% 동일하도록 하려면 이 값을 설정하지 않은 상태로 두십시오.