Sub-commands and Arguments

Common arguments to all sub-commands:

  • -q or --quiet Set verbosity level to 0

  • -v or --verbose Increase verbosity level

Overview of sub-commands:

build
  Build a project

build-deps
  Install build dependencies only

clean
  Clean the project from build files

config
  Read/write configuration

dep (since version 0.2.1)
  Manage dependency of a package

dev-deps
  Install dev dependencies (odoc, ocamlformat, merlin, etc.)

doc
  Generate all documentation (API and Sphinx)

fmt
  Format sources with ocamlformat

headers
  Check all headers in project

install
  Build & install the project in the project opam switch

list (since version 0.4.0)
  List available project or packages skeletons

new
  Create a new project

odoc
  Generate API documentation using odoc in the _drom/docs/doc directory

opam-plugin (since version 0.2.1)
  Install drom as an opam plugin (called by 'opam drom')

package
  Manage a package within a project

project
  Update an existing project

promote
  Promote detected changes after running drom test or drom fmt

publish
  Update opam files with checksums and copy them to a local opam-repository for publication

run
  Execute the project

sphinx
  Generate documentation using sphinx

test
  Run tests

toml
  Read TOML files and print them back on stdout

top
  Run the ocaml toplevel

tree
  Display a tree of dependencies

uninstall
  Uninstall the project from the project opam switch

update
  Update packages in switch

main.exe build

Build a project

DESCRIPTION

This command performs the following actions:

  • 1. Create a local opam switch. The argument –switch SWITCH can be used to make the local switch a link to a global switch. The argument –local can be used to force a local switch to be created.

  • 2. Check that the OCaml version is at least the min-edition specified in the project. If OCaml is not installed, use the –edition VERSION argument or the edition field specified in the project to install OCaml.

  • 3. Install all the dependencies in the opam switch. If the argument –locked was specified, use the ${package}-deps.opam.locked file in the project to get exact dependencies.

  • 4. Build the project by calling opam exec – dune build @install

  • 5. If build was ok, copy executable in the top directory of the project

USAGE

main.exe build [OPTIONS]

Where options are:

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • -y or --yes Reply yes to all questions

main.exe build-deps

Install build dependencies only

USAGE

main.exe build-deps [OPTIONS]

Where options are:

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • -y or --yes Reply yes to all questions

main.exe clean

Clean the project from build files

USAGE

main.exe clean [OPTIONS]

Where options are:

  • --distclean Also remove _opam/ (local switch) and _drom/

main.exe config

Read/write configuration

DESCRIPTION

This command is useful to read/write drom configuration

EXAMPLE

The following displays the list of project skeletons:

drom config --project-skeletons

USAGE

main.exe config [OPTIONS]

Where options are:

  • --no-fetch-share Prevent fetching updates from the share repo (in particular without network connection

  • --package-skeletons List available package skeletons

  • --project-skeletons List available project skeletons

  • --reclone-share Reclone share repository

  • --share-repo SHARE_REPO Set the repository URL of the share database (use ‘default’ for default repo)

  • --share-version SHARE_VERSION Set the version of share database (use ‘latest’ for latest version)

main.exe dep (since version 0.2.1)

Manage dependency of a package

DESCRIPTION

Add, remove and modify dependencies from drom.toml and package.toml files.

If the argument –package is not specified, the dependency is added project-wide (i.e. for all packages), updating the drom.toml file.

If the argument –package is provided, the dependency is added to the package.toml file for that particular package.

Dependencies can be added –add, removed –remove or just modified. The –tool argument should be used for tool dependencies, i.e. dependencies that are not linked to the library/program.

If no modification argument is provided, the dependency is printed in the terminal. Modification arguments are –ver VERSION for the version, –lib LIBNAME for the dune library name, –doc BOOL for documentation deps and –test BOOL for test deps.

EXAMPLE

drom dep --package drom_lib --add ez_cmdliner --ver ">0.1"
drom dep --package drom_lib --remove ez_cmdliner
drom dep --add --tool odoc --ver ">1.0 <3.0" --doc true

VERSION SPECIFICATION

The version specified in the –ver VERSION argument should follow the following format:

  • 1. Spaces are used to separate a conjunction of version constraints.

  • 2. An empty string is equivalent to no version constraint.

  • 3. Constraints are specified using a comparison operation directly followed by the version, like >1.2 or <=1.0.

  • 4. A semantic version like 1.2.3 is equivalent to the constraints >=1.2.3 and <2.0.0.

USAGE

main.exe dep DEPENDENCY [OPTIONS]

Where options are:

  • DEPENDENCY Name of dependency

  • --add Add as new dependency

  • --create BOOL Change project creation status

  • --cross TARGET Build opam packages for cross-compilation (TARGET=windows|osx)

  • --diff Print a diff of user-modified files that are being skipped

  • --doc BOOL Whether dependency is only for doc

  • --edition OCAMLVERSION Set project default OCaml version

  • -f or --force Force overwriting modified files (otherwise, they would be skipped)

  • --lib LIBNAME Dependency should have this libname in dune

  • --min-edition OCAMLVERSION Set project minimal OCaml version

  • --no-fetch-share Prevent fetching updates from the share repo (in particular without network connection

  • --opt BOOL Whether dependency is optional or not

  • --package PACKAGE Attach dependency to this package name

  • --promote-skip Promote user-modified files to skip field

  • --reclone-share Reclone share repository

  • --remove Remove this dependency

  • --share-repo SHARE_REPO Set the repository URL of the share database (use ‘default’ for default repo)

  • --share-version SHARE_VERSION Set the version of share database (use ‘latest’ for latest version)

  • --skip FILE Add FILE to skip list

  • --test BOOL Whether dependency is only for tests

  • --tool Dependency is a tool, not a library

  • --unskip FILE Remove FILE from skip list

  • --ver VERSION Dependency should have this version

main.exe dev-deps

Install dev dependencies (odoc, ocamlformat, merlin, etc.)

USAGE

main.exe dev-deps [OPTIONS]

Where options are:

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • -y or --yes Reply yes to all questions

main.exe doc

Generate all documentation (API and Sphinx)

USAGE

main.exe doc [OPTIONS]

Where options are:

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • --view Open a browser on the documentation

  • -y or --yes Reply yes to all questions

main.exe fmt

Format sources with ocamlformat

USAGE

main.exe fmt [OPTIONS]

Where options are:

  • --auto-promote Promote detected changes immediately

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • -y or --yes Reply yes to all questions

main.exe headers

Check all headers in project

USAGE

main.exe headers [OPTIONS]

Where options are:

  • --add-default HEADER_ID Add this header as the default for these files

  • --from HEADER_ID Replace this header

  • --replace SRC:DST Replace header SRC by header DST

  • --replace-by HEADER_ID Replace by this header

  • --skip HEADER_ID skip this header when printing headers

main.exe install

Build & install the project in the project opam switch

USAGE

main.exe install PACKAGES [OPTIONS]

Where options are:

  • PACKAGES Specify the list of packages to install

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • -y or --yes Reply yes to all questions

main.exe list (since version 0.4.0)

List available project or packages skeletons

DESCRIPTION

List available project or packages skeletons

USAGE

main.exe list ARGUMENTS [OPTIONS]

Where options are:

  • ARGUMENTS Use ‘projects’ or ‘packages’ to display corresponding skeletons

  • --no-fetch-share Prevent fetching updates from the share repo (in particular without network connection

  • --reclone-share Reclone share repository

  • --share-repo SHARE_REPO Set the repository URL of the share database (use ‘default’ for default repo)

  • --share-version SHARE_VERSION Set the version of share database (use ‘latest’ for latest version)

main.exe new

Create a new project

DESCRIPTION

This command creates a new project, with name PROJECT in a directory PROJECT (unless the –inplace argument was provided).

EXAMPLE

The following command creates a project containing library my_lib in src/my_lib:

drom new my_lib --skeleton library

The following command creates a project containing a library hello_lib in src/hello_lib and a program hello in src/hello calling the library:

drom new hello --skeleton program

USAGE

main.exe new PROJECT [OPTIONS]

Where options are:

  • PROJECT Name of the project

  • --create BOOL Change project creation status

  • --diff Print a diff of user-modified files that are being skipped

  • --dir DIRECTORY Dir where package sources are stored (src by default)

  • --edition OCAMLVERSION Set project default OCaml version

  • -f or --force Force overwriting modified files (otherwise, they would be skipped)

  • --inplace Create project in the the current directory

  • --library Project contains only a library

  • --min-edition OCAMLVERSION Set project minimal OCaml version

  • --no-fetch-share Prevent fetching updates from the share repo (in particular without network connection

  • --program Project contains only a program

  • --promote-skip Promote user-modified files to skip field

  • --reclone-share Reclone share repository

  • --share-repo SHARE_REPO Set the repository URL of the share database (use ‘default’ for default repo)

  • --share-version SHARE_VERSION Set the version of share database (use ‘latest’ for latest version)

  • --skeleton SKELETON Create project using a predefined skeleton or one specified in ~/.config/drom/skeletons/

  • --skip FILE Add FILE to skip list

  • --unskip FILE Remove FILE from skip list

  • --virtual Package is virtual, i.e. no code

main.exe odoc

Generate API documentation using odoc in the _drom/docs/doc directory

USAGE

main.exe odoc [OPTIONS]

Where options are:

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • --view Open a browser on the documentation

  • -y or --yes Reply yes to all questions

main.exe opam-plugin (since version 0.2.1)

Install drom as an opam plugin (called by ‘opam drom’)

DESCRIPTION

This command performs the following actions:

  • 1. Install drom executable in $OPAMROOT/plugins/bin/opam-drom

  • 2. Install drom share files in $OPAMROOT/plugins/opam-drom, removing former files

USAGE

main.exe opam-plugin [OPTIONS]

Where options are:

  • --remove Remove drom as an opam plugin

main.exe package

Manage a package within a project

USAGE

main.exe package PACKAGE [OPTIONS]

Where options are:

  • PACKAGE Name of the package

  • --create BOOL Change project creation status

  • --diff Print a diff of user-modified files that are being skipped

  • --dir DIRECTORY Dir where package sources are stored (src by default)

  • --edit Edit package.toml description with EDITOR

  • --edition OCAMLVERSION Set project default OCaml version

  • -f or --force Force overwriting modified files (otherwise, they would be skipped)

  • --library Package is a library

  • --min-edition OCAMLVERSION Set project minimal OCaml version

  • --new SKELETON Add a new package to the project with skeleton NAME

  • --new-file FILENAME (since version 0.2.1) Add new source file

  • --no-fetch-share Prevent fetching updates from the share repo (in particular without network connection

  • --program Package is a program

  • --promote-skip Promote user-modified files to skip field

  • --reclone-share Reclone share repository

  • --remove (since version 0.2.1) Remove a package from the project

  • --rename NEW_NAME Rename secondary package to a new name

  • --skip FILE Add FILE to skip list

  • --unskip FILE Remove FILE from skip list

  • --virtual Package is virtual, i.e. no code

main.exe project

Update an existing project

DESCRIPTION

This command is used to regenerate the files of a project after updating its description.

With argument –upgrade, it can also be used to reformat the toml files, from their skeletons.

USAGE

main.exe project [OPTIONS]

Where options are:

  • --create BOOL Change project creation status

  • --diff Print a diff of user-modified files that are being skipped

  • --edit Edit project description

  • --edition OCAMLVERSION Set project default OCaml version

  • -f or --force Force overwriting modified files (otherwise, they would be skipped)

  • --library Project contains only a library. Equivalent to –skeleton library

  • --min-edition OCAMLVERSION Set project minimal OCaml version

  • --no-fetch-share Prevent fetching updates from the share repo (in particular without network connection

  • --program Project contains a program. Equivalent to –skeleton program. The generated project will be composed of a library package and a driver package calling the Main.main of the library.

  • --promote-skip Promote user-modified files to skip field

  • --reclone-share Reclone share repository

  • --share-repo SHARE_REPO Set the repository URL of the share database (use ‘default’ for default repo)

  • --share-version SHARE_VERSION Set the version of share database (use ‘latest’ for latest version)

  • --skeleton SKELETON Create project using a predefined skeleton or one specified in ~/.config/drom/skeletons/

  • --skip FILE Add FILE to skip list

  • --unskip FILE Remove FILE from skip list

  • --upgrade Force upgrade of the drom.toml file from the skeleton

  • --virtual Package is virtual, i.e. no code. Equivalent to –skeleton virtual.

main.exe promote

Promote detected changes after running drom test or drom fmt

USAGE

main.exe promote [OPTIONS]

Where options are:

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • -y or --yes Reply yes to all questions

main.exe publish

Update opam files with checksums and copy them to a local opam-repository for publication

DESCRIPTION

Before running this command, you should edit the file $HOME/.config/drom/config and set the value of the opam-repo option, like:

[user]
author = "John Doe <john.doe@ocaml.org>"
github-organization = "ocaml"
license = "LGPL2"
copyright = "OCamlPro SAS"
opam-repo = "/home/john/GIT/opam-repository"

Alternatively, you can run it with option –opam-repo REPOSITORY.

In both case, REPOSITORY should be the absolute path to the location of a local git-managed opam repository.

drom publish will perform the following actions:

  • 1. Download the source archive corresponding to the current version

  • 2. Compute the checksum of the archive

  • 3. Copy updated opam files to the git-managed opam repository. During this operation, comment lines, version: and name lines are removed to conform to opam-repository policies.

Note that, prior to calling drom publish, you should update the opam-repository to the latest version of the master branch:

git checkout master
git pull ocaml master

Once the opam files have been added, you should push them to your local fork of opam-repository and create a merge request:

cd ~/GIT/opam-repository
git checkout -b z-$(date --iso)-new-package-version
git add packages
git commit -a -m "New version of my package"
git push

To download the project source archive, drom publish will either use the archive URL of the drom.toml file, or the Github URL (if the github-organization is set in the project), assuming in this later case that the version starts with ‘v’ (like v1.0.0). Two substitutions are allowed in archive: ${version} for the version, ${name} for the package name.

USAGE

main.exe publish [OPTIONS]

Where options are:

  • -f or --force Overwrite existing files

  • --md5 Use md5 instead of sha256 for checksums

  • --opam-repo DIRECTORY Path to local git-managed opam-repository. The path should be absolute. Overwrites the value opam-repo from $HOME/.config/drom/config

main.exe run

Execute the project

DESCRIPTION

This command performs the following actions:

  • 1. Decrease verbosity level to display nothing during build

  • 2. Build the project packages (see drom build for info).

  • 3. Call opam exec – drun exec – [PACKAGE] [ARGUMENTS], where [PACKAGE] is either the package name specified with the -p PACKAGE argument or the main package of the project if it is a program, [ARGUMENTS] are the arguments specified with drom run

USAGE

main.exe run ARGUMENTS [OPTIONS]

Where options are:

  • ARGUMENTS Arguments to the command

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • -p PACKAGE Package to run

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • -y or --yes Reply yes to all questions

main.exe sphinx

Generate documentation using sphinx

DESCRIPTION

This command performs the following actions:

  • 1. Build the project, installing dev dependencies if not done yet (see drom build and drom dev-deps for more info).

  • 2. If a file scripts/before-sphinx.sh exists, run it

  • 3. Build Sphinx documentation using the command sphinx-build sphinx _drom/docs/${sphinx-target}, where ${sphinx-target} is the sphinx-target field in the project description, or sphinx by default. Documentation source files are expected to be found in the top sphinx/ directory.

  • 4. If the argument –view was specified, open a browser on the newly generated documentation

USAGE

main.exe sphinx [OPTIONS]

Where options are:

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • --view Open a browser on the sphinx documentation

  • -y or --yes Reply yes to all questions

main.exe test

Run tests

DESCRIPTION

This command performs the following actions:

  • 1. Build the project, installing required test dependencies if needed

  • 2. Run the test command opam exec – dune build @runtest

If the –all argument was provided, a file _drom/dune-workspace.dev is created containing a context for every existing opam switch compatible with the project min-edition field, and the tests are run on all of them. Before using this option, you should make sure that dependencies are correctly installed on all of them, using the command drom build –switch SWITCH on every SWITCH in the list. Only switches starting with a number and without the + character are selected.

USAGE

main.exe test [OPTIONS]

Where options are:

  • --all Build and run tests on all compatible switches

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • -y or --yes Reply yes to all questions

main.exe toml

Read TOML files and print them back on stdout

DESCRIPTION

Test the TOML parser/printer:

USAGE

main.exe toml FILE [OPTIONS]

Where options are:

  • FILE Parse FILE and write it back on stdout

main.exe top

Run the ocaml toplevel

USAGE

main.exe top ARGUMENTS [OPTIONS]

Where options are:

  • ARGUMENTS Provide arguments for the ocaml toplevel

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • -y or --yes Reply yes to all questions

main.exe tree

Display a tree of dependencies

DESCRIPTION

Print the project as a tree of dependencies, i.e. dependencies are printed as branches of the package they are dependencies of. If a package is itself a dependency of another package, it will be printed there.

EXAMPLE

└──drom (/src/drom)
   └──drom_lib (/src/drom_lib)
      └──toml 5.0.0
      └──opam-file-format 2.1.1
      └──ez_subst >= 0.1
      └──ez_file 0.2.0
      └──ez_config 0.1.0
      └──ez_cmdliner 0.2.0
      └──directories >= 0.2
[tools]
└── ppx_inline_test
└── ppx_expect
└── odoc
└── ocamlformat

USAGE

main.exe tree [OPTIONS]

Where options are:

main.exe uninstall

Uninstall the project from the project opam switch

USAGE

main.exe uninstall [OPTIONS]

Where options are:

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • -y or --yes Reply yes to all questions

main.exe update

Update packages in switch

DESCRIPTION

This command performs the following actions:

  • 1. Call opam update to get information on newly available packages

  • 2. Pin the package dependencies in the local opam switch

  • 3. Call opam upgrade to upgrade packages in the local opam switch

  • 4. Unpin package dependencies

USAGE

main.exe update [OPTIONS]

Where options are:

  • --edition VERSION Use this OCaml edition

  • --local Create a local switch instead of using a global switch

  • --profile PROFILE Build profile to use

  • --switch OPAM_SWITCH Use global switch SWITCH instead of creating a local switch

  • --upgrade Upgrade project files from drom.toml

  • -y or --yes Reply yes to all questions