Cross compiling rust for freebsd?

Hello,

From x86_64-linux (but not aarch64-linux), I’m able to cross compile pkgs.pkgsCross.x86_64-freebsd.hello. However, I’m not able to cross-compile a “hello world” Rust program for freebsd.

I attempted with this flake and a “hello world” rust app (cargo new foo).

{
  description = "Basic template for nix + rust";

  inputs.nixpkgs.url = "github:nixos/nixpkgs/release-23.11";
  outputs = {
    self,
    nixpkgs,
  }: let
    systems = ["aarch64-darwin" "x86_64-linux" "aarch64-linux"];
    eachSystem = with nixpkgs.lib;
      f:
        foldAttrs mergeAttrs {}
        (map (s: mapAttrs (_: v: {${s} = v;}) (f s)) systems);
    # Placeholder name allows one to enter `nix develop` prior to `Cargo.toml` existing
    inherit ((builtins.fromTOML (builtins.readFile ./Cargo.toml)).package) name;
  in
    eachSystem (
      system: let
        pkgs = import nixpkgs {
          inherit system;
        };
      in {
        packages = {
          default = self.packages.${system}.${name};
          ${name} = pkgs.pkgsCross.x86_64-freebsd.callPackage ({rustPlatform}:
            rustPlatform.buildRustPackage {
              inherit name;
              inherit ((builtins.fromTOML (builtins.readFile ./Cargo.toml)).package) version;
              src = ./.;
              cargoLock.lockFile = ./Cargo.lock;
            }) {};
        };
      }
    );
}

I get a boatload of linker errors:

   > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.0' to symbol '__sF' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.3' to symbol 'strtoq_l' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.3' to symbol 'strtouq_l' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.4' to symbol '__ns_newmsg_init' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.4' to symbol '__ns_newmsg_copy' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.4' to symbol '__ns_newmsg_id' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.4' to symbol '__ns_newmsg_flag' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.4' to symbol '__ns_newmsg_q' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.4' to symbol '__ns_newmsg_rr' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.4' to symbol '__ns_newmsg_done' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.4' to symbol '__ns_rdata_unpack' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.4' to symbol '__ns_rdata_equal' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.4' to symbol '__ns_rdata_refers' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSD_1.4' to symbol 'bsearch_b' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSDprivate_1.0' to symbol '__collate_load_error' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSDprivate_1.0' to symbol '_mknod' failed: symbol not defined
       > x86_64-unknown-freebsd13-ld: error: version script assignment of 'FBSDprivate_1.0' to symbol '__sys_mknod' failed: symbol not defined

Is it possible to cross-compile rust for freebsd?

I’d say that it’s currently quite apparently not possible :wink:

FreeBSD support is still in its infancy, I wouldn’t be surprised if it couldn’t even compile rust natively yet, much less cross.