Commit Graph

32 Commits

Author SHA1 Message Date
Joel Galenson
cf4ebb00a6 Add a cargo2android flag to disable generating TEST_MAPPING.
Generating a TEST_MAPPING file uses Bazel, which can be quite slow
(multiple minutes).  Add a flag to allow skipping it.  This is off by
default as it ideally will only be used for debugging.

Test: Run all four configurations of --tests and this flag.
Change-Id: I08bde29ea298fcf677addd86f6d953b6695e147f
2021-04-07 08:39:51 -07:00
Haibo Huang
0f72c95e70 [cargo2android.py] Reserve all lines before the first rust_* rule
Change-Id: Ic3cffcc7f34d878b7cc627f10361d42271b12f1e
2021-03-19 15:17:42 -07:00
Joel Galenson
56446748cf Have cargo2android put warning not to modify Android.bp files
Test: Run cargo2android
Test: Run upgrader script
Change-Id: Idd9fc9b8ad7a7c4fb3da954178d0221c95132fd3
2021-02-18 09:36:53 -08:00
Jeff Vander Stoep
1b24dc3f71 update_crate_tests: fail gracefully
Allow this script to accept a path to the crate being updated.
This allows it to be run separately from cargo2android.

Also, fail gracefully on error. TEST_MAPPING update failures should
not block crate updates.

Test: tools/external_updater/updater.sh update rust/crates/libc
Bug: 179132533
Change-Id: I3a4229f479ab3d2793df16b470f0a0632b9ee495
2021-02-03 21:42:40 +01:00
Jeff Vander Stoep
cec8bac2cb Cargo2Android: add rdep tests to TEST_MAPPING
This is important because:
1. Some crates do not have their own tests enabled in presubmit.
2. As much as possible, we try to stick with one version of each
   crate. This often results in using different versions of
   dependencies than a crate has specified in its Cargo.toml.

Ensuring that a crate's tests continue to pass when its dependencies
are upgraded improves our confidence that the update is safe.

The underlying implementation uses the new Bazel queryview
to query modules and reverse dependencies.

Bug: 168167373
Test: Run cargo2android.py on a number of crates including rusqlite,
scopeguard, lock_api.

Change-Id: Id24f2d3267cf8d5e0369ece2442f8971d4ab1343
2021-01-15 20:56:59 +01:00
Treehugger Robot
169b7827ed Merge "Cleanup cargo2android.py." 2021-01-13 20:47:40 +00:00
Joel Galenson
4319a7e8a5 Cleanup cargo2android.py.
Followup to aosp/1548356 to remove the now unused host parameter to add_test.

Test: Manually run script and verify the output.
Change-Id: Id00e56a2dc5523a44dc3cb473702c1ae8785d3db
2021-01-13 08:36:31 -08:00
Treehugger Robot
a727e45813 Merge "Do not generate TEST_MAPPINGs for host tests" 2021-01-13 16:20:27 +00:00
Joel Galenson
e261a15598 Do not generate TEST_MAPPINGs for host tests
Instead of generating TEST_MAPPING entries for host tests, we add a
test_options section to its Android.bp entry.

Fixes: 176097100
Test: Manually run cargo2android on a few crates and verify the output
Change-Id: Ia57a53dad6910410c7e7aab6d592fba79720f998
2021-01-12 11:31:53 -08:00
Ivan Lozano
0c057ade57 rust: Use rust_ffi for Rust generated C libraries.
We no longer have the rust_library_shared and rust_library_static module
types. They've been renamed to rust_ffi_* instead. This brings
cargo2android.py up to date.

Bug: 175155132
Test: cargo2android's Android.bp for libquiche contains rust_ffi modules
Change-Id: I01bb8b4e56c41d36481ffd363f96aecb770d7cb8
2020-12-15 10:41:26 -05:00
Victor Hsieh
21bea79f5a cargo2android: map fuse crate in crosvm to libfuse_rust
Test: run cargo2android in external/crosvm/fuse and build
Bug: 174797066
Change-Id: I32d092818164d422e263c10f8bf5b7b50971a515
2020-12-04 11:00:46 -08:00
Treehugger Robot
7534ce72da Merge "cargo2android: reorder TEST_MAPPING statements" 2020-11-05 19:16:05 +00:00
Jeff Vander Stoep
d11be480f3 cargo2android: reorder TEST_MAPPING statements
"host: true" entry should go before "name:" to match the output of
json writers which sort by alphabetical order. This will help and
avoid unnecesary changes when adding new tests to TEST_MAPPING - e.g.
aosp/1488728

Bug: 168167373
Test: cargo2android.py --run --tests
verify output

Change-Id: Id346a7f8a2cd910115e7fcc448c589363209bee9
2020-11-05 16:13:36 +01:00
Chih-Hung Hsieh
60140756b8 Give a warning to use --copy-out
* Suggest --copy-out if it is not used, cargo output files are found,
  and env!("CARGO_OUT") is found in .rs files.
* Expect to see this warning for libsqlite3-sys and grpcio-sys,
  which fit to the use case of --copy-out but they have locally
  defined .bp files and non-original output files.
* Fix one pylint warning of extra long line.

Bug: 172299436
Test: run cargo with same flags for all rust/crates/*
Test: run cargo without --copy-out for anyhow, protobuf, clang-sys, etc.
Change-Id: Ic346c8e1146b1bb77e63c4cb12947f202b0f458e
2020-11-03 15:51:52 -08:00
Chih-Hung Hsieh
ec8846be07 Add --patch and --ignore-cargo-errors options
* The given patch file will be applied to ./Android.bp.
* Use --ignore-cargo-errors when it is impossible to
  use the patch file to fix the error messages in Android.bp.

Bug: 172093078
Test: apply on external/rust/crates/*, some with this flag
Change-Id: Ibca2fd4c63e46a32f32c61afedbba960a684f5d7
2020-11-02 21:55:39 +00:00
Chih-Hung Hsieh
610a894a49 Do not use Cargo.lock during cargo build.
* Save Cargo.lock before calling cargo, and restore it after the run.
* Use the --use-cargo-lock flag if the latest dependent crates failed
  to build the current crate. In this case, the published Cargo.lock
  will be used, but the generated .bp might not work with the other
  latest dependent crates in external/rust/crates.
* Fix one gpylint warning.

Bug: 172016745
Test: run through all external/rust/crates/*
Change-Id: I1874a706ac15b74c1dd5a606983b107284d9b28a
2020-11-02 21:49:31 +00:00
Chih-Hung Hsieh
e2342bac4b Add a --copy-out flag for build.rs output files.
* When --copy-out is used:
  * copy build.rs output files to ./out
  * add a genrule module to copy ./out/* files to its output dir
  * add this copy-out genrule module into the srcs list
  This makes include! with $OUT_DIR path work without local patch.
  This only works for the root directory (package).
* Upgrade to python3 for some required shutil and glob functions.
* Unified dump_srcs_list for defaults and non-defaults modules.
* dump_android_property_list output only one line for a single item list.

Bug: 171659849
Test: regenerate all .bp files in rust/crates/*
Change-Id: Ia7dde0ccede2bcc068f23a046e85304c6f50b0b0
2020-10-25 18:06:04 -07:00
Chih-Hung Hsieh
e1b7bb667b Use x86_64-unknown-linux-gnu for host cargo build
* Now a host cargo build uses the same --target flag as a default
  device build.
* When --device is given without --no-host or other device flag,
  we can use one cargo build to get the required rustc flags for
  both host and device builds.
* We still need merge_host_device because cargo build --test could
  recompile a library and create duplicated calls to rustc.
* Fix a gpylint warning missing-function-docstring.
* This change also detected a bug in
  external/rust/crates/structopt-derive/Android.bp
  The cargo build --tests for device was optimized out
  and the device test module was missing in Android.bp.

Bug: 169872957
Test: regenerate all .bp files in external/rust/crates
Change-Id: Ieabdc5a99534a60e4d459c9a966f7a867104c785
2020-10-01 16:59:04 -07:00
Chih-Hung Hsieh
6c13b72f15 Ignore -C codegen-units flag
Test: regenerate .bp files in external/rust/crates/*
Change-Id: I023b0b035d50db9eb7c7462d21beba9b95078378
2020-09-11 21:27:37 -07:00
Chih-Hung Hsieh
63459ed34e Ignore embed-bitcode flag
Bug: 166331593
Test: regenerate .bp files in external/rust/crates
Change-Id: I3051a4d2d4e79b108f44bbed3fb0c51c86b81baf
2020-08-26 11:54:25 -07:00
Andrew Walbran
e51f104b42 libbase from latest crosvm also needs to be renamed.
Bug: 158290206
Test: ran cargo2android.py on latest crosvm
Change-Id: Id6cef5e3af72f7bd8defbc4ed61aa4b5b3729d6b
2020-08-11 16:42:48 +01:00
Chih-Hung Hsieh
07119865a0 Add options to work in a subdirectory.
* Problem to solve:
  When cargo2android.py is run under external/crosvm,
  it does not generate .bp file in some subdirectories like kvm.
* Use --add_workspace flag to append [workspace] in Cargo.toml
  temporarily to generate correct relative source file paths.
  Otherwise, the path will be based on parent/root package
  such as external/crosvm.
* Use --global_defaults=default_name flag to insert a global
  default module name like "crosvm_defaults" in every module.
* Use --no-subdir flag to generate .bp file in one directory,
  and skip all changes to subdirectories.
* Sort the option names so they show up in order with --help.
* Use relative path for local dependent packages.
* Example: run in external/crosvm with flags;
    --run --tests --dependencies --no-subdir
  fix-up external/crosvm/Android.bp file,
  and then run in each subdirectory with flags:
    --run --tests --dependencies --add_workspace
    --global_defaults=crosvm_defaults
* Add rename mapping:
    libminijail ==> libminijail_rust

Bug: 161716839
Test: regen .bp files in external/crosvm subdirectories
Test: make && atest -m -c --include-subdirs external/crosvm
Change-Id: I0c08d358cc2f88f66e99b59032613d2a5b4ea5eb
2020-07-29 15:23:03 -07:00
Chih-Hung Hsieh
776f6a198c Handle -Cflag syntax and use prebuilt cargo.
* Accept both "-C flag" and "-Cflag" syntax.
  * Newer cargo uses "-Cembed-bitcode=no".
  * Some -C flags are filtered out, not used in .bp file,
    because they are meaningless in .bp file build system.
  * Remaining -C flags are passed to rustc in .bp files,
    which was missing before this change.
* Look up cargo in the prebuilts directory.
  * Now limit this script to run only on linux.
  * Try to find cargo/rust version from
    build/soong/rust/config/global.go first.
  * Otherwise, use the latest (largest) version in prebuilt.
* Add a new --cargo_bin flag to use any user-selected cargo.
* Add the selected cargo directory to PATH before calling cargo,
  so it can find rustc in the same directory.

Bug: 161825397
Bug: 161927172
Test: regenerate and check .bp files in external/rust/crates
Change-Id: Ica46f536c2b37b62238d1245ced59685deebad33
2020-07-23 16:04:58 -07:00
Chih-Hung Hsieh
f7eff158a9 Generate TEST_MAPPING for test modules in .bp file
* Share srcs in rust_defaults if len(srcs) is 1.

Test: regenerate .bp and TEST_MAPPING files in external/rust/crates
Test: make
Test: atest -c  --include-subdirs external/rust/crates
Bug: 161259631
Change-Id: I22a1d567ccabcd945e4cac870049ac3ce7a3049a
2020-07-17 16:20:22 -07:00
Chih-Hung Hsieh
e02dce1683 Add EXCLUDED_CRATES and better default names
* protobuf_bin_gen_rust_do_not_use is in EXCLUDED_CRATES
* build_default_name returns a short and readable name
  for a rust_defaults module, from the following choices:
    (1) root_pkg + '_defaults',
    (2) root_pkg + '_defaults_' + crate_name
    (3) root_pkg + '_defaults_' + main_src_basename_path
    (4) root_pkg + '_defaults_' + a_positive_sequence_number

Test: regen external/rust/crates/*/Android.bp
Change-Id: I6aa16a8a6c7ea05744a31a9d4ff0c4524ef91fea
2020-07-14 18:50:15 -07:00
Chih-Hung Hsieh
3725e085ec More options and rename maps; one file per rust_test
* Add a --no-host option.
* Add a --host-first-multilib option.
* Add special renaming for protoc_gen_rust.
* Dump a rust_defaults module to be shared by rust_test modules.
  * Every test source file is in a rust_test module.
  * Add RENAME_DEFAULTS_MAP for altered rust_defaults names.
* Suppress old error message on --extern proc_macro.

Test: regenerate Android.bp files and check differences
Bug: 161090277
Bug: 161089524
Change-Id: I8c70f568facf58d282ea2a2e72b60c8a2972b27d
2020-07-12 23:06:57 -07:00
Chih-Hung Hsieh
35ca4bcf21 Use rustlibs and not deny_warnings.
* The old deny_warnings is replaced with a comment to remind the users.

Test: regenerate Android.bp files and check differences
Bug: 161001041
Bug: 161001220
Change-Id: I96c43cff83edcb7b50e6beee972c9157d20c8dc9
2020-07-10 17:40:36 -07:00
Andrew Walbran
80e90be1b7 Include command-line arguments in comment.
This makes it clear exactly how a build file was generated and how to
reproduce it.

Bug: 158290206
Change-Id: Icf28a66bf0da708a3fcd0fe3d49893191fb1a8f1
2020-06-09 14:33:39 +01:00
Chih-Hung Hsieh
185052a369 Ensure unique name for non-merged modules.
* Do not emit relative_install_path;
  use default unique module name.
* Copy errors in cargo output to Android.bp.
  Some Rust packages are incomplete at crates.io
  and fail to run through cargo test.
* Apply pyformat.

Bug: 156014698
Test: in external/rust/crates/*, cargo2android.py --run --tests
Change-Id: Ide77ca34e47048a8bc03b18eebbe92fb17666784
2020-05-08 12:31:04 -07:00
Chih-Hung Hsieh
8a1a2300ed Accept multiple --crate-type and fix for new cargo.
* Change crate_type string to crate_types list.
  In dump_android_module, iterate over crate_types and
  call dump_one_android_module for each crate type.
* In decide_one_module_type, add mapping of Rust crate types:
        lib => rlib         (no change)
        rlib => rlib        (new)
        dylib => dylib      (new)
        cdylib => shared    (changed)
        staticlib => static (new)
  Maybe we should change and map 'lib' to 'lib',
  but before that, crate_types should not contain
  both 'lib' and 'rlib'.
* Accept new cargo output format, which can
  call rustc with the main source file name after
  other flags, not always after the "--crate-name" flag.
* Work around duplicated test module name problem;
  call self.runner.claim_module_name for every named test module.

Bug: 153118477
Test: fetch quiche-0.3.0, bindgen-0.53.2 and other Rust crates
Test: cargo2android.py --run --vv --device --tests
Change-Id: Id65c3929b5c593df73f26f1510ad7e89194b209e
2020-04-07 10:49:08 -07:00
Chih-Hung Hsieh
6c8d52f6eb Pass --no-default-features to cargo build
* When --features is specified,
  pass --no-default-features to cargo.
* When a dependent Rust package is imported to AOSP,
  if not all "default" features are needed, run
  cargo2android.py with empty or a list of specific features.

Test: cargo2android.py --run # use default features
Test: cargo2android.py --run --features=''  # no default
Test: cargo2android.py --run --features='default,std'
Change-Id: I854f1ecb7d7466490ff34e229ec14a07c1273c6d
2020-03-31 10:08:06 -07:00
Chih-Hung Hsieh
e888737544 A script to run cargo and generate Android.bp.
* Usage note and help for command flags in the script.
  * Run cargo -v multiple times and collect output in cargo.out.
  * Use target.tmp as temporary working directory.
  * Generate multiple Android.bp files into subdirectories.
  * Simplified package names, without version number.
* Merged Android.bp modules.
  * Use --device flag to generate both host and device build targets
    in a combined module.
  * Use --tests flag to generate rust_test modules, with auto_gen_config,
    and multiple unit tests merged in one module.
* Generate cc_library_static modules for rust packages that call
  'cc' and 'ar' to build static C/C++ libraries.
  * Use the --vv flag to call cargo with -vv.
* Limitations:
  * Cargo.toml and its build scripts might need fix for Android first.
  * Depending on user given cargo parameters.
* TODOs:
  * Handle multiple crate types in one rustc command line.
  * Smart merge of host and device rust_test modules,
    to handle device tests that depend on dynamic libraries.
  * Handle special Rust packages that use only build scripts
    and C/C++ compilers to generate included files.

Bug: 142209566
Test: In rust project directories: cargo2android.py --run
Change-Id: Id54652b1e0a6e5fc16619cd05f5b057eee79d610
2019-12-02 15:43:04 -08:00