OASIS User Manual

Introduction

OASIS is a tool to help OCaml developers to integrate configure, build and install systems in their projects. It should help to create standard entry points in the source code build system, allowing external tools to analyse projects easily.

This tool is freely inspired by Cabal which is the same kind of tool for Haskell.

Everything starts with a single text file, named _oasis, at the root of the project source directory. It contains semi-colon separated fields and sections that describe what is contained in the project and what to do with it.

This file is used to generate a skeleton for build, configure and install systems. Generation can be customized through extra fields or directly inside generated files.

The main entry point is an OCaml script setup.ml. It is self contained. Once generated there is no additional dependencies (just like an autoconf configure script).

OASIS has been created with OCamlbuild in mind. So there is probably some features/bugs that are oriented toward this build system.

Features:

Planned features:

Writing _oasis file

Syntax

The _oasis must be a valid UTF-8 text file. This file identify the toplevel directory of the project.

Identifiers are just like variable names in OCaml, it cannot contains "-" or numbers at the beginning. Strings follow OCaml convention. For extra information on the parser/lexer see Genlex.

A line beginning by # is a comment and is ignored. Blank line are ignored.

The file contains semi-colon fields and sections.

Fields

Fields follow are field_name: field_value:

  • Field name is an identifier.
  • Field name is case insensitive.
  • Field value follow string convention (without ").
  • Leading and trailing blanks of field value are removed.
  • A field value can continue on several lines, indent the next line relative to the field name.
  • A blank line in field_name is represented by ..

Sections

Sections can be an identifier or a string:

Library foo

or

Library "foo".

Section name can be : Library, Executable, Document, Test and SourceRepository. Content of a section is indented relative to the section begin.

Example: # Toplevel fields OASISFormat: 1.0

Library "foo"
  # Library fields 
  Path: src/

# Back to toplevel fields
Synopsis: bar

Conditional value

It is possible to define some fields conditionally. Not all fields can be specified this way, only fields that have no good default values and that must be evaluated at runtime is defined.

For example: * Toplevel fields Name and Version cannot be conditional. * Library fields Build and Install can be conditional.

A condition is defined using a if ... else ... construct.

Example: Library bar if os_type(Win32) Build: true else Build: false

Available tests are :

  • os_type(X)
  • system(X)
  • architecture(X)
  • ccomp_type(X)
  • ocaml_version(X)

All tests check that the value X match the value defined in the output of:

ocamlc -config

An additional flag test is available which check that the flag X is defined,

Tests and flags can be combined using standard boolean operation:

  • (expr)
  • ! expr: negation of expr.
  • expr1 && expr2: boolean and.
  • expr1 || expr2: boolean or.
  • true and false.

Package

Package fields are defined outside sections. They apply to the whole project.

Fields:

  • OASISFormat: OASIS format version used to write file _oasis. (mandatory)
  • Name: Name of the package. (mandatory)
  • Version: Version of the package. (mandatory)
  • Synopsis: Short description of the purpose of this package. (mandatory)
  • Description: Long description of the package purpose.
  • Authors: Real people that had contributed to the package. (mandatory)
  • Copyrights: Copyright owners.
  • Maintainers: Current maintainers of the package.
  • LicenseFile: File containing the license.
  • License: DEP-5 license of the package (See DEP-5). (mandatory)
  • OCamlVersion: Version constraint on OCaml.
  • FindlibVersion: Version constraint on Finblib.
  • ConfType: Configuration system.
  • PreConfCommand: Command to run before configuration.
  • PostConfCommand: Command to run after configuration.
  • BuildType: Build system.
  • PreBuildCommand: Command to run before build.
  • PostBuildCommand: Command to run after build.
  • InstallType: Install/uninstall system.
  • PreInstallCommand: Command to run before install.
  • PostInstallCommand: Command to run after install.
  • PreUninstallCommand: Command to run before uninstall.
  • PostUninstallCommand: Command to run after uninstall.
  • PreCleanCommand: Command to run before clean.
  • PostCleanCommand: Command to run after clean.
  • PreDistcleanCommand: Command to run before distclean.
  • PostDistcleanCommand: Command to run after distclean.
  • Homepage: URL of the package homepage.
  • Categories: URL(s) describing categories of the package.
  • FilesAB: Files to generate using environment variable substitution.
  • Plugins: Extra plugins to use.
  • BuildDepends: Dependencies on findlib packages, including internal findlib packages.
  • BuildTools: Tools required to compile, including internal executables.

BuildDepends and BuildTools are appended to all sections and not used directly in the package.

Sections

There are 6 possible sections:

  • Flag: a command line flag.
  • Library: an OCaml library.
  • Executable: an OCaml executable.
  • Document: a document.
  • Test: a test.
  • SourceRepository: version control system information.

None of these sections are mandatory. Library, Executable, Document and Test can be dependent on each other. This not a problem as long as there is no cycle inside the dependency graph. Dependencies can be expressed through BuildDepends and BuildTools fields.

Flag

A flag section defines a configure command line option. It will be translated to to --enable-XXX and --disable-XXX for the command line. It can be used inside conditional fields.

Fields:

  • Description: Help for the flag
  • Default: Default value for the flag

Common fields

These fields are used inside Library and Executable.

Fields:

  • Path: Directory containing the section (mandatory)
  • Build: Set if the section should be built.
  • Install: Set if the section should be distributed.
  • DataFiles: Comma separated list of files to be installed for run-time. (see here)
  • BuildDepends: Dependencies on findlib packages, including internal findlib packages.
  • BuildTools: Tools required to compile, including internal executables.
  • CompiledObject: Define the compilation type of the section: byte, native or best
  • CSources: C source files.
  • CCOpt: -ccopt arguments to use when building.
  • CCLib: -cclib arguments to use when building.
  • DllLib: -dlllib arguments to use when building.
  • DllPath: -dllpath arguments to use when building.
  • ByteOpt: ocamlc arguments to use when building.
  • NativeOpt: ocamlopt arguments to use when building.

All files defined in the section are relative to Path.

Library

Define an OCaml library. OCaml API is generated using ocamldoc applied to Modules with BuildDepends required flags.

Fields:

  • Modules: List of modules to compile.
  • InternalModules: List of modules to compile which are not exported.
  • FindlibParent: Library which includes the current library. The current library will be built as its parents and installed along it.
  • FindlibName: Name used by findlib.
  • FindlibContainers: Virtual containers for sub-package, dot-separated
  • Include all common fields.

Executable

Define an OCaml executable. If the executable is a bytecode that use internal library, an helper script can be generated to set library path.

Fields:

  • MainIs: OCaml file (.ml) containing main procedure for the executable. (mandatory)
  • Custom: Create custom bytecode executable.
  • Include all common fields.

Document

Define a generated document.

Fields:

  • BuildTools: Tools required to compile, including internal executables.
  • Type: Plugin to use to build documentation.
  • PreCommand: Command to run before building the doc.
  • PostCommand: Command to run after building the doc.
  • Title: Title of the document. (mandatory)
  • Authors: Authors of the document.
  • Abstract: Short paragraph giving an overview of the document.
  • Format: Format for the document.
  • Index: Index or top-level file for the document, only apply to HTML and Info.
  • InstallDir: Default target directory to install data and documentation.
  • Build: Set if the section should be built.
  • Install: Set if the section should be distributed.
  • DataFiles: Comma separated list of files to be installed for run-time. (see here)

Test

Define a test to run.

Fields:

  • Type: Plugin to use to run test.
  • TestTools: Tools required to run the test, including internal executables.
  • Command: Command to run for the test. (mandatory)
  • WorkingDirectory: Directory to run the test.
  • PreCommand: Command to run before the test
  • PostCommand: Command to run after the test
  • Run: Enable this test.

SourceRepository

Define VCS informations. There is two special identified repository:

  • head: identify the main development repository.
  • this: identify the repository at the state of the current version.

Fields:

  • Type: VCS type. (mandatory)
  • Location: URL of the repository. The exact form of this field depends on the repository type. (mandatory)
  • Browser: URL where the repository can be navigated using a web browser.
  • Module: CVS requires a named module, as each CVS server can host multiple named repositories. (mandatory for CVS)
  • Branch: Define a meaningful branch for this repository.
  • Tag: Identify a state corresponding to this particular package version.
  • Subdir: Define the relative path from the root of the repository to the top directory for the package, i.e. the directory containing the package's _oasis file.

Supported VCS types are: darcs, git, svn, cvs, hg, bzr, arch, monotone.

License

We have adopted a DEP-5 license style description.

The reason of this format is to have machine-readable license description. Using this former work, we hope to be compatible with future standards of Debian.

We have limited the number of license to:

  • Apache: Apache license (versions 1.0, 1.1, 2.0)
  • Artistic: Artistic license (versions 1.0, 2.0)
  • BSD3: Berkeley software distribution license (3 clauses)
  • BSD4: Berkeley software distribution license (4 clauses)
  • CC-BY: Creative Commons Attribution license
  • CC-BY-NC: Creative Commons Attribution Non-Commercial
  • CC-BY-NC-ND: Creative Commons Attribution Non-Commercial No Derivatives
  • CC-BY-NC-SA: Creative Commons Attribution Non-Commercial Share Alike
  • CC-BY-ND: Creative Commons Attribution No Derivatives
  • CC-BY-SA: Creative Commons Attribution Share Alike license
  • CC0: Creative Commons Universal waiver
  • CDDL: Common Development and Distribution License
  • CeCILL: CEA-CNRS-INRIA Logiciel Libre. GPL like. (versions 1, 2)
  • CeCILL-B: CEA-CNRS-INRIA Logiciel Libre, BSD-like
  • CeCILL-C: CEA-CNRS-INRIA Logiciel Libre, LGPL-like
  • CPL: IBM Common Public License (version 1.0)
  • Eiffel: The Eiffel Forum License (version 2)
  • Expat: The Expat license
  • FreeBSD: FreeBSD Project license
  • GFDL: GNU Free Documentation License (versions 1.1, 1.2, 1.3)
  • GFDL-NIV: GNU Free Documentation License, with no invariant sections (versions 1.1, 1.2, 1.3)
  • GPL: GNU General Public License (versions 1.0, 2.0, 3.0)
  • ISC: Internet Software Consortium's license. Sometimes also known as the OpenBSD License.
  • LGPL: GNU Lesser General Public License. GNU Library General Public License for versions lower than 2.1 (versions 2.0, 2.1, 3.0)
  • LPPL: LaTeX Project Public License (version 1.3c)
  • MIT: MIT License
  • MPL: Mozilla Public License (versions 1.0, 1.1)
  • PD: Public domain. This is not a true license.
  • Perl: Perl license. Equates to GPL-1+ or Artistic-1.
  • PROP: Proprietary license, all rights reserved
  • PSF: Python Software Foundation license (version 2)
  • QPL: Q Public License (version 1.0)
  • W3C-Software: W3C Software License (version 20021231)
  • ZLIB: zlib/libpng license (version 1.2.2)
  • Zope: Zope Public License (versions 1.0, 2.0, 2.1)
  • or an URL describing the license

And license exception to:

  • OCaml linking compatible with LGPL: Add an exception to allow static compilation without license propagation. Without this clause, compiling against an OCaml library force license propagation. The LGPL is equal to GPL without this exception.
  • or an URL describing the license exception

You can specify a license version using a dash and only digits or dashes at the end of the license short name.

Examples :

  • LGPL-2.1 with OCaml linking exception: LGPL v2.1 with OCaml linking exception
  • GPL-2+: GPL v2 or later

Data files

DataFiles fields help to install extra data inside $datadir/$pkg_name. This field is a comma separated list of file, with optional value inside parenthesis. You can override target directory using fn ($datadir/other_location).

You can use wildcard * but only for a filename and followed by a single dot extension: dir/*.html is valid but dir/* and dir/*.tar.gz are not valid.

Substitution inside text

Substitution is performed using Buffer.add_substitute.

Variable are evaluated using environment. This is a mix of various data coming from _oasis file, ocamlc -config output and configure tests. So environment variables depends of each project. You can have a precise idea of what variables is available looking at the file setup.data.

Here is a list of standard variables:

  • ocamlfind
  • ocamlc
  • ocamlopt
  • ocamlbuild
  • pkg_name: Package name
  • pkg_version: Package version
  • os_type
  • system
  • architecture
  • ccomp_type
  • ocaml_version
  • standard_library_default
  • standard_library
  • standard_runtime
  • bytecomp_c_compiler
  • native_c_compiler
  • model
  • ext_obj
  • ext_asm
  • ext_lib
  • ext_dll
  • default_executable_name
  • systhread_supported
  • prefix: Install architecture-independent files dir
  • exec_prefix: Install architecture-dependent files in dir
  • bindir: User executables
  • sbindir: System admin executables
  • libexecdir: Program executables
  • sysconfdir: Read-only single-machine data
  • sharedstatedir: Modifiable architecture-independent data
  • localstatedir: Modifiable single-machine data
  • libdir: Object code libraries
  • datarootdir: Read-only arch-independent data root
  • datadir: Read-only architecture-independent data
  • infodir: Info documentation
  • localedir: Locale-dependent data
  • mandir: Man documentation
  • docdir: Documentation root
  • htmldir: HTML documentation
  • dvidir: DVI documentation
  • pdfdir: PDF documentation
  • psdir: PS documentation
  • destdir: Prepend a path when installing package
  • findlib_version
  • is_native
  • suffix_program
  • rm: Remove a file.
  • rmdir: Remove a directory.
  • debug: Compile with ocaml debug flag on.
  • profile: Compile with ocaml profile flag on.
  • ocamlbuildflags: OCamlbuild additional flags

Other variables are defined depending on your _oasis file:

  • Variables from BuildDepends: pkg_ and the name of the findlib package. It points to the directory containing the package. If there is a version constraint, it is also translated to a variable. It contains a boolean value to know if the version is ok or not. Internal findlib packages don't create variables. Example: BuildDepends: oUnit (>= 1.0.3) becomes two variables pkg_oUnit = /usr/lib/ocaml/ounit and pkg_oUnit_ge_1_0_3 = true.
  • Variables from external BuildTools: the variable is the name given in the field and its value the filename of the executable. Example: BuildTools: make becomes make = /usr/bin/make.
  • Dynamic variables from internal BuildTools: the variable is the name of the Executable section and its value the filename of the executable. Example: Executable ocamlmod becomes ocamlmod = _build/src/tools/ocamlmod. These variables are set through setup.log rather than setup.data. They are set only when the corresponding files is built.

It is also possible to apply transformation through functions. This is useful when you need to use properties that need to be determined at runtime:

  • utoh: convert an Unix filename into a host filename (e.g. UNIX -> Win32 conversion).
  • ocaml_escaped: call to String.escaped.

For example $(utoh src/test.ml) will be replaced by src\test.ml on Windows.

Customization of generated files

When OASIS generates file, it always replace only lines between OASIS_START and OASIS_STOP. These keywords are commented and followed by data to check that content is unchanged.

If the file doesn't exist, OASIS will create the whole file using default header and footer.

If OASIS detects a change inside the section being replaced, it will create a backup of the file and issue a warning.

Customization of setup.ml

setup.ml as any generated files can be customized in its header and footer. Moreover it can be customized through hook in the code directly.

TODO: explains hook.

Using OASIS during software development

Since _oasis becomes a central place of information about the building process, it can be quite cumbersome to run again and again oasis. You can avoid it using the -dev flags when calling oasis for the first time. This way it will rebuilt very dependents build files each time you call ocaml setup.ml. A setup.ml built this way, should not be distributed. This intended for development purpose only.

Plugins

OASIS is basically built around plugins. They are used to define specific behavior for generating files and including their own code in setup.ml.

There are 6 categories of plugin:

  • Conf: apply to configure step, used in the field ConfType
  • Build: apply to build stepi, used in the field BuildType
  • Test: apply to test sections, used in the field Type of a test
  • Doc: apply to documentation sections, used in the field Type of a document
  • Install: apply to install and uninstall steps, used in the field DocType
  • Extra: everything else, used in the field Plugins

Plugin Custom (doc, conf, test, install, build)

Version: 0.2

This plugin allow to define a set of three commands to perform each steps, associated with the following fields:

  • XCustomXXX: main action to run.
  • XCustomXXXClean: action to run when clean is invoked.
  • XCustomXXXDistclean: action to run when distclean is invoked.

XXX stands for Conf, Build, Doc, Test, Install or Uninstall.

Action to run is a simple shell command. It can contain substitution variables as defined in [this section][#substitution].

Package fields:

  • XCustomConf: Run command to configure. (mandatory)
  • XCustomConfClean: Run command to clean configure step.
  • XCustomConfDistclean: Run command to distclean configure step.
  • XCustomBuild: Run command to build. (mandatory)
  • XCustomBuildClean: Run command to clean build step.
  • XCustomBuildDistclean: Run command to distclean build step.
  • XCustomInstall: Run command to install. (mandatory)
  • XCustomInstallClean: Run command to clean install step.
  • XCustomInstallDistclean: Run command to distclean install step.
  • XCustomUninstall: Run command to uninstall. (mandatory)
  • XCustomUninstallClean: Run command to clean uninstall step.
  • XCustomUninstallDistclean: Run command to distclean uninstall step.

Document fields:

  • XCustom: Run command to build documentation. (mandatory)
  • XCustomClean: Run command to clean build documentation step.
  • XCustomDistclean: Run command to distclean build documentation step.

Test fields:

  • XCustomClean: Run command to clean test step.
  • XCustomDistclean: Run command to distclean test step.

Plugin None (install, test, build, doc, conf)

Version: 0.2

This plugin basically does nothing. It helps to replace mandatory step by nothing.

Plugin OCamlbuild (build, doc)

Version: 0.2

This plugin uses OCamlbuild to generate a build system. It is the default value for BuildType.

It is also possible to use this plugin for Document. In this case, OCamlbuild will also be involved in the generation of a particular document.

Document fields:

  • XOCamlbuildPath: Top level directory for building ocamldoc documentation (mandatory)
  • XOCamlbuildModules: List of OCaml modules used to generate ocamldoc documentation
  • XOCamlbuildLibraries: Findlib names of internal libraries used to generate the ocamldoc documentation

Plugin Internal (conf, install)

Version: 0.2

This plugin is the default value for the ConfType and InstallType. It represents a default behavior for configuring and installing OCaml project.

The configure part take care of checking:

  • Tools availability (ocamlfind, ocamlc et al)
  • OCaml version
  • Findlib packages

The install part take care of installing executables, libraries and data files using standard environment variable ($bindir, $datadir et al).

Plugin META (extra)

Version: 0.2

This plugin is an helper to generate a META files that can be distributed and install with a library. It uses library name, version, synopsis and dependencies to generate matching fields in META.

Library fields:

  • XMETAEnable: Enable META generation
  • XMETADescription: META package description
  • XMETAType: Type of META package, set default predicates for archive
  • XMETARequires: Requires field for META package

Plugin StdFiles (extra)

Version: 0.2

This plugin generates standard files like README.txt, INSTALL.txt and AUTHORS.txt. These files will summarize data contains in _oasis.

The .txt extension has been added to allow easy editing/viewing under Windows and other system that look for extension to determine file type.

Package fields:

  • XStdFilesREADME: Enable README file generation.
  • XStdFilesREADMEFilename: Real filename to use for file README.
  • XStdFilesINSTALL: Enable INSTALL file generation.
  • XStdFilesINSTALLFilename: Real filename to use for file INSTALL.
  • XStdFilesAUTHORS: Enable AUTHORS file generation.
  • XStdFilesAUTHORSFilename: Real filename to use for file AUTHORS.

Plugin DevFiles (extra)

Version: 0.2

It helps to generate a toplevel Makefile and configure files which only invoke setup.ml. It aims to provide good old entry points.

Package fields:

  • XDevFilesMakefileNoTargets: Targets to disable when generating Makefile
  • XDevFilesEnableMakefile: Generate Makefile
  • XDevFilesEnableConfigure: Generate configure script

Building and installing

The file setup.ml is the base system to run every targets. It contains a self contained OCaml script, that only depends on OCaml standard installation that doesn't require using stublibs (no Str or Unix). This constraint is required to be fully portable even on system that doesn't support dynamic loading.

The file setup.data is the result of the configure step and contains data that can be used for other step. It is removed only in distclean target. The format of this file is on variable and values per line: var="value". The value is an OCaml string. The file in this form can be read by make and sh. Once generated this file should not be modified.

The file setup.log contains a list of action done and is used and updated by action done and cancel (e.g. action install log files installed which action uninstall remove).

ocaml setup.ml -configure

This is the first step to perform. It is mandatory. It runs various test of the build environment to check that everything required is installed.

ocaml setup.ml -build

This step is mandatory. Build libraries and executables.

ocaml setup.ml -test

This step is optional. Run defined test. Need the build step before.

ocaml setup.ml -doc

This step is optional. It builds API documentation for library and extra documentation as defined in Document.

ocaml setup.ml -install

This step is mandatory. Install what has been built in build and doc step. Also install data files as defined in DataFiles fields.

ocaml setup.ml -uninstall

This step is optional. Remove files and libraries installed.

ocaml setup.ml -reinstall

This step is optional. Perform an uninstall and then an install step.

ocaml setup.ml -clean

This step is optional. Clean generated files during build and doc steps.

ocaml setup.ml -distclean

This step is optional. Try to go back to pristine source state.

ocaml setup.ml -all

This step is optional. Run configure, build, test and doc step in one run.

OASIS usage

Command line

OASIS (C) 2009-2010 OCamlCore SARL

oasis [global-options] subcommand [subcommand-options]

Global options:

This program allows to manipulate OASIS enabled package, i.e. package that contains an _oasis file. It is made of several subcommands that provide features around this file. Some subcommands require the installation of third party plugins.

You need to specify a subcommand as defined in the following above.

-C dir

Change directory before running.

-quiet

Run quietly

-debug

Output debug message

-help|--help

Display this list of options

Available subcommands:

check

Check an _oasis file

help

Display help for a subcommand

manual

Display user manual

query

Query an _oasis file

quickstart

Launch an helper to write _oasis file

setup

Translate _oasis into a build system

setup-clean

Clean all template files from their content

setup-dev

Translate _oasis into a build system that auto-update

Subcommand check

This subcommand load an _oasis file and apply standard checks.

Usage: oasis [global-options] check [options]

Options:

-ignore-plugins

Ignore plugin's field.

-oasis fn

_oasis file to use.

Subcommand help

This subcommand display help of other subcommands or of all subcommands.

Usage: oasis [global-options*] help [subcommand|all]

Subcommand manual

This subcommand print the manual of OASIS. It uses the markdown syntax to print it and more precisely the pandoc extension of this syntax.

This manual describes the command line tool oasis, the _oasis file format and the generated setup.ml file.

Usage: oasis [global-options*] manual

Options:

-o fn
Output manual to filename.

Subcommand query

This subcommand load an _oasis file and search its content for information.

The query string follow this convention:

  • ListSections: return all the section found
  • ListFields: return all the fields, it recurses through sections
  • field: search for this field in the toplevel
  • section.field: search for this field in the section

Query examples:

  • version: return the version
  • executable("test").install: return the field "install" of the executable "test".

You can use multiple queries, they will be executed in order.

Usage: oasis [global-options] query [options] query*

Options:

-separator str

String to add between answers.

-oasis fn

_oasis file to use.

-ignore-plugins

Ignore plugin's field.

Subcommand quickstart

This subcommand is an helper to write _oasis file. It asks a serie of questions to create an initial _oasis file. The questions depend on the level of the user, you can set this level with the -level command line option.

At the end of the process, you have the possibility to edit, to display or to write the generated file.

Usage: oasis [global-options] quickstart [options]

Options:

-level {beginner|intermediate|expert}

Quickstart level, skip questions according to this level.

-machine

Computer readable questions for automatic completion.

-real-oasis

Use the real 'oasis' executable filename when generating developper mode setup.ml.

-run

Run a command after generating files, this is the mode used by setup.ml in developper mode. Don't use it directly.

-only-setup

When generating the build system, keep only setup.ml and delete other generated files.

-oasis fn

_oasis file to use.

Subcommand setup

This is the main subcommand of oasis, it compiles the _oasis file into a self contained setup.ml. The generated file handle the various step to configure, build and install your project.

Usage: oasis [global-options*] setup

Options:

-oasis fn
_oasis file to use.

Subcommand setup-clean

This subcommand go through every generated files and remove the replaceable part in it. It also tries to clean backup files made by a failed SetupDev subcommand invocation.

The replaceable part of a generated file is everything between OASIS_START and OASIS_STOP.

Usage: oasis [global-options] setup-clean [options]

Options:

-replace-sections Empty
replace section in generated files (i.e. remove content between OASIS_START and OASIS_STOP).

Subcommand setup-dev

This subcommand is the developper counterpart of the Setup subcommand. It acts the same way but it produces a setup.ml that still requires the executable oasis in order to recompile the _oasis file at each invocation.

The big advantage to create a setup.ml this way is that you don't have to call oasis setup each time you update the _oasis file. The other advantage is that it keeps clean your build system, i.e. it generates a file, use it and reset it to its pristine state, which helps to maintain the changes in this file to the bare minimum.

This subcommand is suited for developpers, but you should use the Setup subcommand when you want to distribute your work.

Usage: oasis [global-options] setup-dev [options]

Options:

-real-oasis

Use the real 'oasis' executable filename when generating developper mode setup.ml.

-run

Run a command after generating files, this is the mode used by setup.ml in developper mode. Don't use it directly.

-only-setup

When generating the build system, keep only setup.ml and delete other generated files.

-oasis fn

_oasis file to use.