Initial commit
This commit is contained in:
commit
68fbcfb32e
9 changed files with 361 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
result
|
||||||
43
README.md
Normal file
43
README.md
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
# wasm-sdk
|
||||||
|
|
||||||
|
A SDK for LLVM C and C++ WebAssembly development based on Nix.
|
||||||
|
|
||||||
|
It builds all required dependencies (*clang, clang++, wasm-ld, libcxx, compiler-rt*, and *wasi-libc*)
|
||||||
|
and exposes the following environment variables needed to compile to WebAssembly, for example:
|
||||||
|
|
||||||
|
```
|
||||||
|
WASM_LLVM=/nix/store/akpcpb9ycb98jjbp6dyg1j65vkwqp1lm-wasm-llvm
|
||||||
|
WASM_LIBCXX_LIB=/nix/store/ll4hi2jkhv8399dhbz6q0qgw97c6hyja-wasm-libcxx/lib
|
||||||
|
WASM_LIBCXX_INC=/nix/store/ll4hi2jkhv8399dhbz6q0qgw97c6hyja-wasm-libcxx/include/c++/v1
|
||||||
|
WASM_COMPILER_RT_LIB=/nix/store/59lmk928vly8126zq7mabzc9123hknj2-wasm-compiler-rt/lib/wasi
|
||||||
|
WASI_LIBC_LIB=/nix/store/qislis4ivwv3l721dbhghax6j4kp3ccb-wasi-libc/lib
|
||||||
|
WASI_LIBC_INC=/nix/store/71k5vk20275571n0bsij42qdasbxc82b-wasi-libc-dev/include
|
||||||
|
```
|
||||||
|
|
||||||
|
## Goals
|
||||||
|
|
||||||
|
* Lean toolchain leveraging as much as possible from upstream sources.
|
||||||
|
* Basic levels of WASI (no threading, no exceptions).
|
||||||
|
|
||||||
|
|
||||||
|
## Versions
|
||||||
|
|
||||||
|
* LLVM: 17
|
||||||
|
* wasi-libc: 21
|
||||||
|
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
The included derivation produces a single file with exportable environment variables.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
env $(cat $(nix-build -E 'with import <nixpkgs> {}; callPackage ./default.nix {}')) printenv
|
||||||
|
```
|
||||||
|
|
||||||
|
A *flake* is also included that exposes the needed variables in the following ways (three ways to choose from, for convenience):
|
||||||
|
|
||||||
|
1. as the `paths` (*attrset* type) *passthru* of the *derivation* of the *default package* (to use in other *flakes*).
|
||||||
|
2. as exported environment variables in the *default development shell* (`nix develop`).
|
||||||
|
3. as text in a file (`nix build` produces the file `./result`).
|
||||||
34
default.nix
Normal file
34
default.nix
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
{ pkgs, lib, ... }:
|
||||||
|
let
|
||||||
|
wasm-llvm = import ./wasm-llvm.nix { inherit pkgs; };
|
||||||
|
wasm-libcxx = import ./wasm-libcxx.nix { inherit pkgs; };
|
||||||
|
wasi-libc = import ./wasi-libc.nix { inherit pkgs; };
|
||||||
|
wasm-compiler-rt = import ./wasm-compiler-rt.nix { inherit pkgs; };
|
||||||
|
|
||||||
|
paths = {
|
||||||
|
WASM_LLVM = wasm-llvm;
|
||||||
|
WASM_LIBCXX_LIB = "${wasm-libcxx}/lib";
|
||||||
|
WASM_LIBCXX_INC = "${wasm-libcxx}/include/c++/v1";
|
||||||
|
WASM_COMPILER_RT_LIB = "${wasm-compiler-rt}/lib/wasi";
|
||||||
|
WASI_LIBC_LIB = "${wasi-libc}/lib";
|
||||||
|
WASI_LIBC_INC = "${wasi-libc.dev}/include";
|
||||||
|
};
|
||||||
|
|
||||||
|
pathsFileContents = lib.strings.concatLines (
|
||||||
|
lib.attrsets.mapAttrsToList (name: value: name + "=" + value) paths
|
||||||
|
);
|
||||||
|
in
|
||||||
|
pkgs.stdenv.mkDerivation rec {
|
||||||
|
name = "wasm-sdk";
|
||||||
|
version = "1.0.0";
|
||||||
|
|
||||||
|
dontUnpack = true;
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
echo "${pathsFileContents}" > $out
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
inherit paths;
|
||||||
|
};
|
||||||
|
}
|
||||||
27
flake.lock
generated
Normal file
27
flake.lock
generated
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1714253743,
|
||||||
|
"narHash": "sha256-mdTQw2XlariysyScCv2tTE45QSU9v/ezLcHJ22f0Nxc=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "58a1abdbae3217ca6b702f03d3b35125d88a2994",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
17
flake.nix
Normal file
17
flake.nix
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{ self, nixpkgs }:
|
||||||
|
let
|
||||||
|
pkgs = nixpkgs.legacyPackages.x86_64-linux;
|
||||||
|
package = import ./default.nix pkgs;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
packages.x86_64-linux.default = package;
|
||||||
|
formatter.x86_64-linux = pkgs.nixfmt-rfc-style;
|
||||||
|
devShells.x86_64-linux.default = pkgs.mkShell package.paths;
|
||||||
|
};
|
||||||
|
}
|
||||||
32
wasi-libc.nix
Normal file
32
wasi-libc.nix
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
{ pkgs }:
|
||||||
|
with pkgs;
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
name = "wasi-libc";
|
||||||
|
version = "21";
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "WebAssembly";
|
||||||
|
repo = "wasi-libc";
|
||||||
|
rev = "refs/tags/wasi-sdk-21";
|
||||||
|
hash = "sha256-mQp54JYb3bsmyQy5SByPFu9uxhKDy/XXF7lF9bEUfOo=";
|
||||||
|
};
|
||||||
|
|
||||||
|
wasm-llvm = import ./wasm-llvm.nix { inherit pkgs; };
|
||||||
|
|
||||||
|
outputs = [
|
||||||
|
"out"
|
||||||
|
"dev"
|
||||||
|
"share"
|
||||||
|
];
|
||||||
|
|
||||||
|
dontInstall = true;
|
||||||
|
dontFixup = true;
|
||||||
|
|
||||||
|
makeFlags = [
|
||||||
|
"CC=${wasm-llvm}/bin/clang"
|
||||||
|
"NM=${wasm-llvm}/bin/nm"
|
||||||
|
"AR=${wasm-llvm}/bin/ar"
|
||||||
|
"SYSROOT_LIB=${builtins.placeholder "out"}/lib"
|
||||||
|
"SYSROOT_INC=${builtins.placeholder "dev"}/include"
|
||||||
|
"SYSROOT_SHARE=${builtins.placeholder "share"}/share"
|
||||||
|
];
|
||||||
|
}
|
||||||
40
wasm-compiler-rt.nix
Normal file
40
wasm-compiler-rt.nix
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
{ pkgs }:
|
||||||
|
with pkgs;
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
name = "wasm-compiler-rt";
|
||||||
|
version = "17.0.6";
|
||||||
|
src = fetchzip {
|
||||||
|
url = "https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-17.0.6.tar.gz";
|
||||||
|
hash = "sha256-8MEDLLhocshmxoEBRSKlJ/GzJ8nfuzQ8qn0X/vLA+ag=";
|
||||||
|
};
|
||||||
|
|
||||||
|
wasm-llvm = import ./wasm-llvm.nix { inherit pkgs; };
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
cmake
|
||||||
|
ninja
|
||||||
|
];
|
||||||
|
|
||||||
|
dontFixup = true;
|
||||||
|
|
||||||
|
configurePhase = ''
|
||||||
|
cmake -G Ninja \
|
||||||
|
-DCMAKE_MODULE_PATH=${wasm-llvm.dev}/cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=${wasm-llvm.dev}/cmake/toolchain.cmake \
|
||||||
|
-DCOMPILER_RT_BAREMETAL_BUILD=ON \
|
||||||
|
-DCOMPILER_RT_INCLUDE_TESTS=OFF \
|
||||||
|
-DCOMPILER_RT_HAS_FPIC_FLAG=OFF \
|
||||||
|
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=$out \
|
||||||
|
$src/compiler-rt/lib/builtins
|
||||||
|
'';
|
||||||
|
|
||||||
|
buildPhase = ''
|
||||||
|
ninja -v
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
ninja -v install
|
||||||
|
'';
|
||||||
|
}
|
||||||
69
wasm-libcxx.nix
Normal file
69
wasm-libcxx.nix
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
{ pkgs }:
|
||||||
|
with pkgs;
|
||||||
|
stdenv.mkDerivation rec {
|
||||||
|
name = "wasm-libcxx";
|
||||||
|
version = "17.0.6";
|
||||||
|
src = fetchzip {
|
||||||
|
url = "https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-17.0.6.tar.gz";
|
||||||
|
hash = "sha256-8MEDLLhocshmxoEBRSKlJ/GzJ8nfuzQ8qn0X/vLA+ag=";
|
||||||
|
};
|
||||||
|
|
||||||
|
wasm-llvm = import ./wasm-llvm.nix { inherit pkgs; };
|
||||||
|
|
||||||
|
wasi-libc = import ./wasi-libc.nix { inherit pkgs; };
|
||||||
|
|
||||||
|
dontFixup = true;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
cmake
|
||||||
|
ninja
|
||||||
|
python3
|
||||||
|
];
|
||||||
|
|
||||||
|
configurePhase = ''
|
||||||
|
cmake -G Ninja \
|
||||||
|
-DCMAKE_C_COMPILER_WORKS=ON \
|
||||||
|
-DCMAKE_CXX_COMPILER_WORKS=ON \
|
||||||
|
-DCMAKE_AR=${wasm-llvm}/bin/ar \
|
||||||
|
-DCMAKE_MODULE_PATH=${wasm-llvm.dev}/cmake \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=/${wasm-llvm.dev}/cmake/toolchain.cmake \
|
||||||
|
-DCMAKE_STAGING_PREFIX=$out \
|
||||||
|
-DCMAKE_POSITION_INDEPENDENT_CODE=OFF \
|
||||||
|
-DLIBCXX_ENABLE_THREADS:BOOL=OFF \
|
||||||
|
-DLIBCXX_HAS_PTHREAD_API:BOOL=OFF \
|
||||||
|
-DLIBCXX_HAS_EXTERNAL_THREAD_API:BOOL=OFF \
|
||||||
|
-DLIBCXX_HAS_WIN32_THREAD_API:BOOL=OFF \
|
||||||
|
-DLLVM_COMPILER_CHECKED=ON \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DLIBCXX_ENABLE_SHARED:BOOL=OFF \
|
||||||
|
-DLIBCXX_ENABLE_EXCEPTIONS:BOOL=OFF \
|
||||||
|
-DLIBCXX_ENABLE_FILESYSTEM:BOOL=OFF \
|
||||||
|
-DLIBCXX_ENABLE_ABI_LINKER_SCRIPT:BOOL=OFF \
|
||||||
|
-DLIBCXX_CXX_ABI=libcxxabi \
|
||||||
|
-DLIBCXX_HAS_MUSL_LIBC:BOOL=ON \
|
||||||
|
-DLIBCXX_ABI_VERSION=2 \
|
||||||
|
-DLIBCXXABI_ENABLE_EXCEPTIONS:BOOL=OFF \
|
||||||
|
-DLIBCXXABI_ENABLE_SHARED:BOOL=OFF \
|
||||||
|
-DLIBCXXABI_SILENT_TERMINATE:BOOL=ON \
|
||||||
|
-DLIBCXXABI_ENABLE_THREADS:BOOL=OFF \
|
||||||
|
-DLIBCXXABI_HAS_PTHREAD_API:BOOL=OFF \
|
||||||
|
-DLIBCXXABI_HAS_EXTERNAL_THREAD_API:BOOL=OFF \
|
||||||
|
-DLIBCXXABI_HAS_WIN32_THREAD_API:BOOL=OFF \
|
||||||
|
-DLIBCXXABI_USE_LLVM_UNWINDER:BOOL=OFF \
|
||||||
|
-DUNIX:BOOL=ON \
|
||||||
|
--debug-trycompile \
|
||||||
|
-DCMAKE_SYSROOT_COMPILE=${wasi-libc.dev} \
|
||||||
|
-DCMAKE_SYSROOT_LINK=${wasi-libc} \
|
||||||
|
-DCMAKE_CXX_FLAGS="-fno-exceptions" \
|
||||||
|
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi" \
|
||||||
|
${src}/runtimes
|
||||||
|
'';
|
||||||
|
|
||||||
|
buildPhase = ''
|
||||||
|
ninja -v
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
ninja -v install
|
||||||
|
'';
|
||||||
|
}
|
||||||
98
wasm-llvm.nix
Normal file
98
wasm-llvm.nix
Normal file
|
|
@ -0,0 +1,98 @@
|
||||||
|
{ pkgs }:
|
||||||
|
with pkgs;
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
name = "wasm-llvm";
|
||||||
|
version = "17.0.6";
|
||||||
|
src = fetchzip {
|
||||||
|
url = "https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-17.0.6.tar.gz";
|
||||||
|
hash = "sha256-8MEDLLhocshmxoEBRSKlJ/GzJ8nfuzQ8qn0X/vLA+ag=";
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
cmake
|
||||||
|
ninja
|
||||||
|
python3
|
||||||
|
];
|
||||||
|
|
||||||
|
phases = [
|
||||||
|
"configurePhase"
|
||||||
|
"installPhase"
|
||||||
|
];
|
||||||
|
|
||||||
|
outputs = [
|
||||||
|
"out"
|
||||||
|
"dev"
|
||||||
|
];
|
||||||
|
|
||||||
|
configurePhase = ''
|
||||||
|
cmake -G Ninja \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=$out \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DLLVM_ENABLE_ZLIB=OFF \
|
||||||
|
-DLLVM_ENABLE_TERMINFO=OFF \
|
||||||
|
-DLLVM_ENABLE_ZSTD=OFF \
|
||||||
|
-DLLVM_STATIC_LINK_CXX_STDLIB=ON \
|
||||||
|
-DLLVM_HAVE_LIBXAR=OFF \
|
||||||
|
-DLLVM_INCLUDE_TESTS=OFF \
|
||||||
|
-DLLVM_INCLUDE_UTILS=OFF \
|
||||||
|
-DLLVM_INCLUDE_BENCHMARKS=OFF \
|
||||||
|
-DLLVM_INCLUDE_EXAMPLES=OFF \
|
||||||
|
-DLLVM_TARGETS_TO_BUILD=WebAssembly \
|
||||||
|
-DLLVM_DEFAULT_TARGET_TRIPLE=wasm32-wasi \
|
||||||
|
-DLLVM_ENABLE_PROJECTS="lld;clang;clang-tools-extra" \
|
||||||
|
-DLLVM_INSTALL_BINUTILS_SYMLINKS=TRUE \
|
||||||
|
-DLLVM_ENABLE_LIBXML2=OFF \
|
||||||
|
$src/llvm
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $dev/cmake
|
||||||
|
|
||||||
|
cat > $dev/cmake/toolchain.cmake <<-CMAKE
|
||||||
|
set(CMAKE_SYSTEM_NAME WASI)
|
||||||
|
set(CMAKE_SYSTEM_VERSION 1)
|
||||||
|
set(CMAKE_SYSTEM_PROCESSOR wasm32)
|
||||||
|
set(triple wasm32-wasi)
|
||||||
|
|
||||||
|
set(CMAKE_C_COMPILER $out/bin/clang)
|
||||||
|
set(CMAKE_CXX_COMPILER $out/bin/clang++)
|
||||||
|
set(CMAKE_ASM_COMPILER $out/bin/clang)
|
||||||
|
set(CMAKE_AR $out/bin/llvm-ar)
|
||||||
|
set(CMAKE_RANLIB $out/bin/llvm-ranlib)
|
||||||
|
|
||||||
|
set(CMAKE_C_COMPILER_TARGET wasm32-wasi)
|
||||||
|
set(CMAKE_CXX_COMPILER_TARGET wasm32-wasi)
|
||||||
|
set(CMAKE_ASM_COMPILER_TARGET wasm32-wasi)
|
||||||
|
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
||||||
|
CMAKE
|
||||||
|
|
||||||
|
mkdir -p $dev/cmake/Platform
|
||||||
|
echo "set(WASI 1)" > $dev/cmake/Platform/WASI.cmake
|
||||||
|
|
||||||
|
ninja -v \
|
||||||
|
install-clang \
|
||||||
|
install-clang-format \
|
||||||
|
install-clang-tidy \
|
||||||
|
install-clang-apply-replacements \
|
||||||
|
install-lld \
|
||||||
|
install-llvm-mc \
|
||||||
|
install-llvm-ranlib \
|
||||||
|
install-llvm-strip \
|
||||||
|
install-llvm-dwarfdump \
|
||||||
|
install-clang-resource-headers \
|
||||||
|
install-ar \
|
||||||
|
install-ranlib \
|
||||||
|
install-strip \
|
||||||
|
install-nm \
|
||||||
|
install-size \
|
||||||
|
install-strings \
|
||||||
|
install-objdump \
|
||||||
|
install-objcopy \
|
||||||
|
install-c++filt \
|
||||||
|
install-llvm-config
|
||||||
|
'';
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue