Nix 的 clang 不会构建 wasm

Nix's clang won't build wasm

我有一个包含以下导入的 C Wasm 模块:

__attribute__((import_module("env"), import_name("runtime_exit"))) void exit(int);

我正在 Linux:

使用 Clang 12.0.0 进行编译
clang --target=wasm32 --no-standard-libraries \
      -c -Ofast -o out.o in.c

使用我的包管理器 (xbps) 中的包,这工作正常。在 Nix 中(推导见下文),但是(Clang 12.0.1),我在 nix-build:

上收到以下警告
tests/test.h:1:16: warning: unknown attribute 'import_module' ignored [-Wunknown-attributes]
__attribute__((import_module("env"), import_name("runtime_exit"))) void exit(int);
               ^~~~~~~~~~~~~~~~~~~~

tests/test.h:1:38: warning: unknown attribute 'import_name' ignored [-Wunknown-attributes]
__attribute__((import_module("env"), import_name("runtime_exit"))) void exit(int);

这只是一个警告,但 linking 后来失败了:事实上,clang 试图 link 与 ld,而不是 wasm-ld 甚至 lld.

我的 default.nix 指定:

{ pkgs ? import <nixpkgs> {} }:

let
  stdenv = pkgs.llvmPackages_12.stdenv;
  src = ./.; # etc, etc
in
  stdenv.mkDerivation {
    # --- snip ---
    buildPhase = ''
      clang --target=wasm32 --no-standard-libraries \
            -c -Ofast -o $out/out.o in.c
    '';
    
    # --- snip ---

    buildInputs = [ pkgs.clang_12 pkgs.lld_12 ];
  }

我不明白为什么这不起作用,但我尝试使用的所有不同包变体似乎都表明我错误地访问了 LLVM 工具链。

如果这还不够,请告诉我。谢谢!

编辑

Nix 似乎不尊重 --target 参数:

$ nix-shell
[nix-shell:~/...]$ clang -target wasm32 --print-target-triple
x86_64-unknown-linux-gnu
[nix-shell:~/...]$ exit
$ clang --target=wasm32 --print-target-triple
wasm32

尽管如此,clang 还是 wasm32 作为可用目标。

Nix 给出的 clang 包装器脚本似乎可以做一些事情。应使用 clang-[VERSION] 而不是 clang 调用编译器,例如:

clang-12 --target=wasm32 --no-standard-libraries   \
         -c -std=c99 -Ofast -Wall -Werror -pedantic \
         input.c -o output.o