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
我有一个包含以下导入的 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