TODO: write the corresponding Part 8 in https://fstar-lang.org/tutorial
This repository is the result of splitting Steel away from the F* code base. It now works with F* and Karamel master branches.
This repository contains:
- Steel, and its corresponding examples and tests, from F* master
- The Karamel extraction tests for Steel, and the Steel part of krmllib (currently binding the pthreads spinlock) (which we now call LibSteel), from Karamel master
- SteelC and its examples, from FStarLang/FStar#2349
This repository has been designed to closely follow the Filesystem Hierarchy Standard (FHS), so that it can be used the same way in all the following cases:
- direct use of the Steel repository clone
- installation into a FHS-like hierarchy (e.g.
/usr/local) - installation as an opam package, using the opam package manager for OCaml
In all cases, a Steel installation (or the Steel repository clone) is laid out as follows:
-
in
lib/steel:- the Steel F* modules of the
SteelandSteel.STnamespaces - the Steel F* plugin,
steel.cmxs, containing the Steel tactic, and the Steel and SteelC extraction to krml, is installed here - the LibSteel C library,
libsteel.a, containing an implementation of what used to be the Steel part of krmllib (currently binding the pthreads spinlock), is installed here
- the Steel F* modules of the
-
in
lib/steel/runtime: the Steel OCaml runtime,steel_runtime.cmxa, necessary to compile and run Steel code extracted to OCaml, is installed here -
in
lib/steel/c: the SteelC F* modules of theSteel.CandSteel.ST.Cnamespaces -
in
include/steel: the C include files necessary to compile Steel code extracted to C -
in
share/steel:Makefile.include, the GNU Make rules to verify Steel code
In addition, share/steel also contains all examples and tests, but
those are not installed as of now.
- Z3 4.8.5 exactly
- OCaml 4.10 or higher
- GNU Make
- A GCC-compatible compiler
- F* 2023.04.15 or higher (installed via opam or via its source. A binary package is unlikely to work, since Steel needs to dynamically load a plugin.)
- Karamel, but only if you are interested in extracting to C. If you are only interested in verifying Steel code, or extracting to OCaml, then Karamel is not needed.
- Make sure
fstar.exeis in yourPATH. If F* was installed with opam, you may need to runeval $(opam env). If F* is not in yourPATH, set theFSTAR_EXEenvironment variable the full path for the F* executable. - Run
make -j
- Follow the instructions above to build Steel from the source.
- Install with
PREFIX=<your prefix> make -j install. By default,PREFIXwill be set to/usr/local, as per the UNIX custom.
-
Clone the F* repository and install F* with
opam install <path to FStar>/./fstar.opam. This will build F* and all of its dependencies (including Z3)(Right now the F* release on the opam package repository is too old. Once version 2023.04.15 or later is made available on the opam repository, cloning the F* repository will no longer be necessary, and
opam install fstarshould be enough for this step.) -
Build and install Steel with
opam install ./steel.opam
Steel comes with share/steel/Makefile.include (which is also
properly installed by make install or via opam), which contains the
GNU Make rules to call F* with the Steel include path and the Steel
plugin loaded.
-
Make sure
fstar.exeis in yourPATH. If F* was installed with opam, you may need to runeval $(opam env). If F* is not in yourPATH, set theFSTAR_EXEenvironment variable the full path for the F* executable. -
Define the
STEEL_HOMEenvironment variable. This should be one of the following:- If used directly from source: The root directory of your clone of the Steel repository
- If installed with
make install: The PREFIX directory used when installing Steel - If installed with
opam: The prefix directory of the opam switch where Steel was installed, obtained withopam config var prefix
-
(Optional) In your Makefile, define the following variables with
+=or:=:FSTAR_FILES: some more F* files to verify, in addition to the*.fstand.fstifiles of your projectEXCLUDE_FILES: some F* to skip for verificationFSTAR_OPTIONS: additional options to pass to F*. WhileMakefile.includeis already configured to use Steel, you need to add more options if you need SteelC:- if you want to use SteelC, add
--include $STEEL_HOME/lib/steel/c
- if you want to use SteelC, add
FSTAR_DEP_OPTIONS: additional options to pass to F* to compute dependencies (in addition toFSTAR_OPTIONS), such as--extractFSTAR_ML_CODEGEN: useful only if you want to extract OCaml code. If you want to extract a F* plugin, set this option toPlugin. Otherwise, it is set by default toOCaml.
-
After those variable definitions, insert
include $STEEL_HOME/share/steel/Makefile.includeto your Makefile. -
In your project directory, run
make -j verify
If you already have an existing Makefile for your Steel-based
project, you now need to pass new options to your Makefile to use
Steel from this repository, as described in this section.
To call F* with Steel:
- Make sure F* and Steel are properly located, following steps 1 and 2 above.
- Pass the following options to F*:
- in all cases,
--include $STEEL_HOME/lib/steel --load_cmxs steel - if you want to use SteelC, add
--include $STEEL_HOME/lib/steel/c
- in all cases,
TODO: we should distribute a binary package with the Steel plugin
statically linked in fstar.exe. In that case, the --load_cmxs steel
option to load the Steel plugin would no longer be necessary. Then,
what about the --include paths?
TODO: add instructions to extract code. Meanwhile, see:
share/steel/examples/steel/llist2/Makefilefor a C extraction example. (The rule to extract*.krmlfiles is already in theshare/steel/Makefile.includefile distributed and installed with Steel.)share/steel/examples/steel/OWGCounterfor an OCaml extraction example. This example has both aMakefileto extract the Steel code to C, and adunefile to compile the extracted OCaml code. Most notably, to compile and run OCaml code extracted from Steel,$STEEL_HOME/libhas to be added toOCAMLPATH(which is already the case by default with opam, if the opam environment is properly set up witheval $(opam env)), and thesteel.runtimepackage has to be used.
If you want to contribute to Steel or SteelC code, please read
CONTRIBUTING.md