Android Rust 모듈

일반적으로 rust_* 모듈 정의는 cc_* 사용법 및 기대치를 엄밀히 준수합니다. 다음은 Rust 바이너리의 모듈 정의 예입니다.

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

이 페이지에서는 rust_* 모듈의 가장 일반적인 속성을 살펴봅니다. 특정 모듈 유형과 모듈 정의 예에 관한 자세한 정보를 보려면 바이너리 모듈, 라이브러리 모듈 또는 테스트 모듈 페이지를 참고하세요.

기본 모듈 유형

유형정의추가 정보
rust_binaryRust 바이너리 바이너리 모듈 페이지
rust_libraryRust 라이브러리를 생성하고 rlib 변형과 dylib 변형을 제공합니다. rust_library, 라이브러리 모듈 페이지
rust_fficc 모듈이 사용할 수 있는 Rust C 라이브러리를 생성하고 정적 변형과 공유 변형을 제공합니다. rust_ffi, 라이브러리 모듈 페이지
rust_proc_macroproc-macro Rust 라이브러리를 생성합니다. (컴파일러 플러그인과 유사합니다.) rust_proc_macro, 라이브러리 모듈 페이지
rust_test표준 Rust 테스트 하네스를 사용하는 Rust 테스트 바이너리를 생성합니다. 테스트 모듈 페이지
rust_fuzzlibfuzzer를 사용하여 Rust 퍼징 바이너리를 생성합니다. rust_fuzz 모듈 예
rust_protobuf소스를 생성하고, 특정 protobuf의 인터페이스를 제공하는 Rust 라이브러리를 생성합니다. Protobufs 모듈소스 생성기 페이지
rust_bindgen소스를 생성하고, C 라이브러리로의 Rust 바인딩을 포함하는 Rust 라이브러리를 생성합니다. Bindgen 바인딩 모듈소스 생성기 페이지

주요 공통 속성

아래의 속성은 모든 Android Rust 모듈에서 공통으로 사용됩니다. 개별 Rust 모듈과 관련된 추가(고유) 속성은 개별 모듈 페이지에 나와 있습니다.

name

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

stem

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

모듈 이름을 원하는 출력 파일 이름으로 설정할 수 없는 경우 stem 함수를 사용하세요. 예를 들어 log 크레이트의 경우 liblog cc_library가 이미 존재하므로 rust_library의 이름이 liblog_rust입니다. 이 경우 stem 속성을 사용하면 출력 파일의 이름을 liblog_rust.*가 아닌 liblog.*로 지정할 수 있습니다.

srcs

srcs는 모듈의 진입점(일반적으로 main.rs 또는 lib.rs)을 나타내는 하나의 소스 파일을 포함합니다. rustc는 컴파일에 필요한 다른 모든 소스 파일의 결정 및 검색을 처리합니다. 이러한 소스 파일은 생성되는 deps 파일에 열거됩니다.

가능한 경우 플랫폼 코드에는 이 방식을 사용하지 마세요. 자세한 내용은 소스 생성기를 참고하세요.

crate_name

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

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

lints

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

  • default(모듈 위치에 따른 기본 린트 세트)
  • android(모든 Android 플랫폼 코드에 적용되는 가장 엄격한 린트 세트)
  • vendor(공급업체 코드에 적용되는 엄격하지 않은 린트 세트)
  • none(모든 린트 경고 및 오류 무시)

clippy_lints

clippy 린터도 기본적으로 소스 생성기를 제외한 모든 모듈 유형을 대상으로 실행됩니다. 모듈 소스를 검증하는 데 사용되는 몇 가지 린트 세트가 정의되어 있으며 가능한 값은 다음과 같습니다.

  • default(모듈 위치에 따른 기본 린트 세트)
  • android(모든 Android 플랫폼 코드에 적용되는 가장 엄격한 린트 세트)
  • vendor(공급업체 코드에 적용되는 엄격하지 않은 린트 세트)
  • none(모든 린트 경고 및 오류 무시)

edition

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

flags

flags는 컴파일 중에 rustc로 전달할 플래그로 구성된 문자열 목록을 포함합니다.

ld_flags

ld-flags는 컴파일 중에 링커로 전달할 플래그로 구성된 문자열 목록을 포함합니다. Id_flags는 -C linker-args rustc 플래그에 의해 전달됩니다. clang는 링커 프런트엔드로 사용되어 실제 링크를 위해 lld를 호출합니다.

features

features는 컴파일 중에 사용 설정해야 하는 기능으로 구성된 문자열 목록입니다. features는 --cfg 'feature="foo"'에 의해 rustc로 전달됩니다. 대부분의 기능이 추가되어 대개 이 목록은 모든 종속 모듈에 필요한 전체 기능 세트로 구성됩니다. 그러나 기능이 상호 배타적인 경우에는 충돌하는 기능을 제공하는 빌드 파일에서 추가 모듈을 정의해야 합니다.

cfgs

cfgs는 컴파일 중에 사용 설정할 cfg 플래그로 구성된 문자열 목록을 포함합니다. cfgs는 --cfg foo--cfg "fizz=buzz"에 의해 rustc로 전달됩니다.

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

  • dylib로 빌드된 모듈에는 android_dylib cfg 집합이 있습니다.

  • VNDK를 사용할 모듈에는 android_vndk cfg 집합이 있습니다. 이는 C++의 __ANDROID_VNDK__ 정의와 비슷합니다.

strip

strip은 출력 파일이 삭제되는 방식과 삭제될지 여부를 제어합니다(해당하는 경우). strip을 설정하지 않으면 기기 모듈에서 기본적으로 mini debuginfo를 제외한 모든 항목을 삭제합니다. 기본적으로 호스트 모듈은 기호를 삭제하지 않습니다. 유효한 값에는 none(삭제 사용 안 함), all(mini debuginfo를 포함하여 모든 항목 삭제)이 있습니다. Soong 모듈 참조에서 더 많은 값을 확인할 수 있습니다.

host_supported

host_supported 매개변수는 기기 모듈이 호스트 변형을 제공해야 할지 여부를 나타냅니다.

라이브러리 종속 항목 정의

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

속성 이름 설명
rustlibs 종속 항목인 rust_library 모듈의 목록. 빌드 시스템이 선호하는 링크를 선택할 수 있도록 지원합니다. rustlibs를 종속 항목을 선언하는 기본적인 방법으로 사용하세요. (아래의 Rust 라이브러리에 링크하는 경우 참고)
rlibs rlibs로서 정적으로 링크되어야 하는 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 속성을 사용하여 링크하세요. 이렇게 하면 빌드 시스템이 루트 모듈에 필요한 사항에 따라 올바른 링크를 선택할 수 있고, 종속 항목 트리가 라이브러리의 rlib 버전과 dylib 버전을 모두 포함할 가능성을 줄여 줍니다(모두 포함할 경우 컴파일이 실패합니다).

지원되지 않으며 제한되는 지원 빌드 기능

Soong의 Rustvendorvendor_ramdisk 이미지와 스냅샷을 제한적으로 지원합니다. 단, staticlibs, cdylibs, rlibs, binaries는 지원됩니다. 공급업체 이미지 빌드 타겟의 경우에는 android_vndk cfg 속성이 설정되어 있습니다. 시스템 타겟과 공급업체 타겟이 다른 경우 코드에서 이 속성을 사용할 수 있습니다. rust_proc_macros는 공급업체 스냅샷의 일부로 캡처되지 않습니다. rust_proc_macros에 종속되는 경우 적절하게 버전 관리해야 합니다.

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

증분 빌드

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

경고: 이는 빌드봇에서 생성된 바이너리와 동일한 바이너리를 생성한다고 보장하지 않습니다. 객체 파일에 포함된 함수나 데이터의 주소는 다를 수 있습니다. 생성된 아티팩트가 EngProd 인프라에서 빌드한 아티팩트와 완전히 일치하도록 하려면 이 값을 설정하지 않은 채로 둡니다.