Difference between revisions of "WebAssembly/Compiler"

From Lazarus wiki
Jump to navigationJump to search
(removed the outdated section)
(29 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 
== Instructions ==
 
== Instructions ==
=== Compiling the compiler ===
+
 
 +
=== Prerequisites ===
 +
 
 +
The ''wasm-ld'' linker. This the linker from the LLVM project. The external assembler ''llvm-mc'' is optional, since commit bc76487b878e59133ce3c2cc19ebb13f9a9826ea, in which, the internal assembler and object writer was enabled.
 +
 
 +
LLVM 11.0 is known to work. Development was done, using the Fedora packages llvm-11.0.0-1.fc33.x86_64 and lld-11.0.0-1.fc33.x86_64. Initial tests on MacOS used llvm-11 installed with MacPorts (https://www.macports.org) and according symlinks in /opt/local/bin (wasm32-wasi-llvm-mc -> llvm-mc-mp-11 and wasm32-embedded-llvm-mc -> llvm-mc-mp-11).
 +
 
 +
LLVM 12.0.1 also works.
 +
 
 +
=== Obtaining the compiler sources ===
 +
 
 +
The WebAssembly target was merged into FPC SVN trunk in r48955 on 2021-03-14. Since then, Free Pascal has moved to GitLab, so now it's now included in the git 'main' branch.
  
 
Get the sources:
 
Get the sources:
  
  git clone https://github.com/skalogryz/freepascal fpc-wasm
+
  git clone https://gitlab.com/freepascal.org/fpc/source.git fpc-wasm
+
 
switch to correct branch:
+
enter the directory:
 
  cd fpc-wasm
 
  cd fpc-wasm
git checkout webasm
 
  
compile:
+
=== Supported targets ===
cd compiler
 
 
 
====Using Lazarus====
 
open ppcwasm.lpi
 
hit the "compile" button.
 
  
=====Using command-line=====
+
==== WASI - The WebAssembly System Interface ====
fpc -dnoopt -dwasm -Fiwasm -Fuwasm -Fusystems -S2 pp.pas
 
  
the compiler can be renamed
+
[https://wasi.dev/ WASI] is a modular system interface for WebAssembly. It allows creating portable and secure programs that can run in a sandboxed command-line environment. See the WASI website for more information.
mv pp ppwasm
 
or, on windows:
 
mv pp.exe ppwasm.exe
 
  
=== Using the compiler ===
+
To build the compiler for the WASI target:
  
You need a system.pas unit. It can be found here:
+
make all OS_TARGET=wasi CPU_TARGET=wasm32 BINUTILSPREFIX= OPT="-O-" PP=fpc
  
[https://github.com/skalogryz/wasm-demo wasm-demo]
+
The following units have been ported for the WASI target:
  
You'll also need the wasm bin tools:
+
* system
 +
* objpas
 +
* iso7185
 +
* ctypes
 +
* strings
 +
* wasiapi - interface for the WASI API
  
[https://github.com/WebAssembly/wabt/releases wasm bin tools]
+
Additionally, these units compile, but are not yet fully functional and/or tested very well:
  
Extract the binaries and put them somewhere in your PATH.
+
* dos
 +
* sysutils
 +
* classes
 +
* math
 +
* fgl
  
And you'll need some more wasmtool:
+
See [[WebAssembly/Roadmap]] for details.
  
[https://github.com/skalogryz/wasmbin wasmtool]
+
Compiled WASI binaries work with wasmtime version 0.23.0 or in the browser by opening:
  
* Compile wasmtool.lpi
+
https://webassembly.sh/
  
Put wasmtool somewhere in your PATH
+
and drag and dropping the .wasm binary directly into the browser window.
  
And finally you need ''wasm-ld'' (don't confuse it with ''wasmld''). ToDo: Describe where to get wasm-ld.
+
==== Embedded target ====
  
==wasm-demo==
+
The [[TARGET_Embedded|Embedded target]] is primarily used for embedded systems, without an operating system. However, it also happens to be a perfect fit for creating WebAssembly modules that don't use any particular operating system-like API.
Wasm-demo is a Pascal WebAssembly demo project, ported Google's C WebAssembly example (https://codelabs.developers.google.com/codelabs/web-assembly-intro)
 
  
You follow these steps in order to get the demo project working:
+
make all OS_TARGET=embedded CPU_TARGET=wasm32 BINUTILSPREFIX= OPT="-O-" PP=fpc
  
1. Get the project sources: https://github.com/skalogryz/wasm-demo
+
=== Using the compiler ===
 
 
===Using in webassembly.studio===
 
2. Run the wasm compiler against lyff.pas, but request the assembler file to be kept
 
  pp -a lyff.pas
 
Webassembly.studio accepts the assembler file and would compile it on the server side.
 
 
 
3. open up  https://webassembly.studio and select "Create empty Wat Project". The project will consist of:
 
:main.html
 
:main.js
 
:main.wat
 
All files of the project can be edited through the web interface.
 
  
4. Copy and paste the contents of the following files:
+
Hint: If your fpc.cfg has
: (compiled) lyff.wat to main.wat.
+
<pre>
: wasm-demo\webassembly.studio\main.html to main.html
+
#IFDEF FPC_CROSSCOMPILING
: wasm-demo\webassembly.studio\main.js to main.js
+
#IFDEF NEEDCROSSBINUTILS
 +
  -XP$FPCTARGET-
 +
#ENDIF
 +
#ENDIF
 +
</pre>
  
Note: every time you copy and paste, don't forget to press "SAVE" button (on the right side of the web interface)
+
Enclose it in '''#IFNDEF CPUWASM32''' :
 +
<pre>
 +
#IFDEF FPC_CROSSCOMPILING
 +
#IFDEF NEEDCROSSBINUTILS
 +
#ifndef cpuwasm32
 +
  -XP$FPCTARGET-
 +
#endif
 +
#ENDIF
 +
#ENDIF
 +
</pre>
  
5. once all files are update, hit "Build and Run"
+
Otherwise, you have to create symlinks wasm32-wasi-llvm-mc to llvm-mc, and wasm32-wasi-wasm-ld to wasm-ld.
  
 
==See Also==
 
==See Also==
 
*[[WebAssembly]]
 
*[[WebAssembly]]
 
[[Category:WebAssembly]]
 
[[Category:WebAssembly]]

Revision as of 04:27, 3 October 2021

Instructions

Prerequisites

The wasm-ld linker. This the linker from the LLVM project. The external assembler llvm-mc is optional, since commit bc76487b878e59133ce3c2cc19ebb13f9a9826ea, in which, the internal assembler and object writer was enabled.

LLVM 11.0 is known to work. Development was done, using the Fedora packages llvm-11.0.0-1.fc33.x86_64 and lld-11.0.0-1.fc33.x86_64. Initial tests on MacOS used llvm-11 installed with MacPorts (https://www.macports.org) and according symlinks in /opt/local/bin (wasm32-wasi-llvm-mc -> llvm-mc-mp-11 and wasm32-embedded-llvm-mc -> llvm-mc-mp-11).

LLVM 12.0.1 also works.

Obtaining the compiler sources

The WebAssembly target was merged into FPC SVN trunk in r48955 on 2021-03-14. Since then, Free Pascal has moved to GitLab, so now it's now included in the git 'main' branch.

Get the sources:

git clone https://gitlab.com/freepascal.org/fpc/source.git fpc-wasm

enter the directory:

cd fpc-wasm

Supported targets

WASI - The WebAssembly System Interface

WASI is a modular system interface for WebAssembly. It allows creating portable and secure programs that can run in a sandboxed command-line environment. See the WASI website for more information.

To build the compiler for the WASI target:

make all OS_TARGET=wasi CPU_TARGET=wasm32 BINUTILSPREFIX= OPT="-O-" PP=fpc

The following units have been ported for the WASI target:

  • system
  • objpas
  • iso7185
  • ctypes
  • strings
  • wasiapi - interface for the WASI API

Additionally, these units compile, but are not yet fully functional and/or tested very well:

  • dos
  • sysutils
  • classes
  • math
  • fgl

See WebAssembly/Roadmap for details.

Compiled WASI binaries work with wasmtime version 0.23.0 or in the browser by opening:

https://webassembly.sh/

and drag and dropping the .wasm binary directly into the browser window.

Embedded target

The Embedded target is primarily used for embedded systems, without an operating system. However, it also happens to be a perfect fit for creating WebAssembly modules that don't use any particular operating system-like API.

make all OS_TARGET=embedded CPU_TARGET=wasm32 BINUTILSPREFIX= OPT="-O-" PP=fpc

Using the compiler

Hint: If your fpc.cfg has

#IFDEF FPC_CROSSCOMPILING
#IFDEF NEEDCROSSBINUTILS
  -XP$FPCTARGET-
#ENDIF
#ENDIF

Enclose it in #IFNDEF CPUWASM32 :

#IFDEF FPC_CROSSCOMPILING
#IFDEF NEEDCROSSBINUTILS
#ifndef cpuwasm32
  -XP$FPCTARGET-
#endif
#ENDIF
#ENDIF

Otherwise, you have to create symlinks wasm32-wasi-llvm-mc to llvm-mc, and wasm32-wasi-wasm-ld to wasm-ld.

See Also