尼克斯的叮当不会制造浪费



我有一个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);

这只是一个警告,但是随后的连接失败了:事实上,clang试图连接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仍然是一个可用的目标。

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

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

相关内容

  • 没有找到相关文章

最新更新