Skip to content

Rust macros fail to cross-compile #1

Description

@nickdecooman

When a crate contains Rust macros, cross-compiling the target from MacOS to Linux fails. An example is the postgres crate.

bazel build //cargo:postgres --platforms //build/platform:musl

can't find crate for futures_macro
--> external/raze__futures_util__0_3_19/src/async_await/stream_select_mod.rs:6:9
|
6 | pub use futures_macro::stream_select_internal;
| ^^^^^^^^^^^^^ can't find crate
|
= note: extern location for futures_macro is of an unknown type: bazel-out/darwin-opt-exec-2B5CBBC6/bin/external/raze__futures_macro__0_3_19/libfutures_macro-152066848.dylib
= help: file name should be lib*.rlib or lib*..so

The error is caused because, for the futures_macro crate, a .dylib file was generated instead of a .rlib (or .so?) file.

The issue also occurs when I write my own macros and use the rust_proc_macro Bazel rule.

Let's say I have this src/lib.rs

use proc_macro::TokenStream;

#[proc_macro_derive(HelloWorld)]
pub fn hello_world(_input: TokenStream) -> TokenStream {
    TokenStream::new()
}

and BUILD.bazel like this:

load("@rules_rust//rust:defs.bzl", "rust_proc_macro")

rust_proc_macro(
    name = "macro",
    srcs = [
        "src/lib.rs",
    ],
    edition = "2018",
)

Running bazel build //:macro now builds a valid .dylib file. However, bazel build //:macro --platforms //build/platform:musl fails with the following error:

note: /usr/local/bin/x86_64-linux-musl-ld: cannot find -lgcc

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions