[cwn] Attn: Development Editor, Latest OCaml Weekly News

Alan Schmitt alan.schmitt at polytechnique.org
Tue Jun 19 06:24:21 PDT 2018


Hello

Here is the latest OCaml Weekly News, for the week of June 12 to 19,
2018.

Table of Contents
─────────────────

New tool to generate the CWN
You like parmap? You like parany?
opam-check-all: Are your packages broken for the upcoming OCaml releases?
OCaml job opportunity at Citrix in Cambridge UK
Omod 0.0.1
Tools for logic programming in OCaml
opam-ci: first release of a tool to check the health of your packages
Does OCaml ecosystem have CSS preprocessors?
Old CWN


――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――


New tool to generate the CWN
════════════════════════════

  Archive: [https://framagit.org/brab/cwn]

  /The editor announced:/


  Thanks to the hard work of [Enzo Crance], we now have an OCaml-based
  tool to generate the OCaml weekly news. We now use [Org mode] for the
  conversion to html and text. Please don't hesitate to [contact me] for
  any bug report or suggestion.




  ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――


[Enzo Crance] https://github.com/cloudyhug

[Org mode] http://orgmode.org/

[contact me] mailto:alan.schmitt at polytechnique.org


You like parmap? You like parany?
═════════════════════════════════

  Archive:
  [https://discuss.ocaml.org/t/you-like-parmap-you-like-parany/2131/1]

  /UnixJunkie announced:/


  So, here comes parpair: [https://github.com/UnixJunkie/parpair]

  The ultimate step in minimalist parallel programming.

  Of course, your function needs to be pretty heavy in order for the
  computation to be accelerated.




  ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――


opam-check-all: Are your packages broken for the upcoming OCaml releases?
═════════════════════════════════════════════════════════════════════════

  Archive:
  [https://discuss.ocaml.org/t/ann-opam-check-all-are-your-packages-broken-for-the-upcoming-ocaml-releases/1875/28]

  /Continuing this discussion, Kate announced:/


  The service now has a proper domain name: [http://check.ocamllabs.io/]




  ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――


OCaml job opportunity at Citrix in Cambridge UK
═══════════════════════════════════════════════

  Archive:
  [https://discuss.ocaml.org/t/ocaml-job-opportunity-at-citrix-in-cambridge-uk/2132/1]

  /Christian Lindig announced:/


  The Citrix office in Cambridge develops the [XenServer] hypervisor
  which is open source and builds on [Xen]. The toolstack part of the
  product, which orchestrates the VMs, is developed in OCaml (see
  [GitHub]) and the team is looking for an engineer with strong affinity
  to functional programming in the Unix environment.  Feel free to send
  me an email at [christian.lindig at citrix.com] with any questions.
  Below is the official job description.

  [https://jobs.citrix.com/job/CITRA005811517/Software-Engineer-Functional-Programming]




  ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――


[XenServer] https://www.citrix.co.uk/products/xenserver/

[Xen] https://www.xenproject.org

[GitHub] http://www.github.com/xapi-project

[christian.lindig at citrix.com] mailto:christian.lindig at citrix.com


Omod 0.0.1
══════════

  Archive:
  [https://sympa.inria.fr/sympa/arc/caml-list/2018-06/msg00020.html]

  /Daniel Bünzli announced:/


  I'd like to announce `omod' which provides data-driven module toplevel
  loaders.

  Like `ocamlfind' it allows to load compilation objects and their
  dependencies in the toplevel. However `omod' works without additional
  metadata files and with top level (compilation unit) module names
  rather than ocamlfind package or archive names.

  This means you only need to know the name of the module you want to
  load rather than having to remember in which `ocamlfind' package or
  archive it lives.

  It should work well in `ocaml', `ocamlnat'[0] and `utop'. To get
  started type:

  ┌────
  │ opam install omod
  └────

  and follow the [tutorial][1]. More information on how `omod' came to
  be is given below [2].

  omod is ISC licensed and can be found at
  [http://erratique.ch/software/omod]

  Best,

  Daniel

  P.S. Currently `omod' doesn't work with opam system compilers.

  [0] One issue with `ocamlnat' is that some libraries lack their `cmxs'
  files. E.g.  the lack of `threads.cmxs' prevents the `Core' module
  from loading. But other ones like `Irmin', `Containers' or `Base' do
  however load in `ocamlnat' via `omod'.

  [1]: [http://erratique.ch/software/omod/doc/Omod.html#tutorial]

  [2] This is basically a dependency-less rewrite of `odig''s toplevel
  loaders which will be removed from `odig'. It solves the following
  problems they had:

  1. Too many dependencies. They brought too many dependencies in the
     toplevel including `compiler-libs' which are problematic in
     `ocamlnat​'. `omod' has no dependency, so using it limits toplevel
     scope pollution to the `Omod' module only which loads fine in
     `ocamlnat'.
  2. Resolution for multiple load sequences. `odig' had no support for
     choosing between multiple load solutions (e.g. for library
     variants). `omod' has both a variant specification syntax and an
     interactive mode to resolve them.
  3. Slow. They were too slow on large libraries as resolution was done
     in the (bytecode) toplevel itself, `omod''s performance (and API)
     should be improved for scripting however it is reasonably fast for
     your toplevel interactive usage.
  4. Outdated information in long running toplevel sessions. They
     provided no mecanism to update the package information whenever the
     package install base changed.

  To solve 1., 3. and 4. the `Omod' API invokes the `omod' binary with
  the `load' sub-command (whose textual output you can check when you
  suspect there's a problem) to find out the load sequences.




  ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――


Tools for logic programming in OCaml
════════════════════════════════════

  Archive:
  [https://discuss.ocaml.org/t/tools-for-logic-programming-in-ocaml/2126/4]

  /Continuing this thread from last week, th3rac said:/


  Also [https://github.com/c-cube/datalog], a Datalog implementation




  ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――


opam-ci: first release of a tool to check the health of your packages
═════════════════════════════════════════════════════════════════════

  Archive:
  [https://discuss.ocaml.org/t/ann-opam-ci-first-release-of-a-tool-to-check-the-health-of-your-packages/2146/1]

  /Anil Madhavapeddy announced:/


  /Cross posted from
  [https://github.com/ocaml/infrastructure/wiki/Using-the-opam-ci-tool]/

  Have you submitted a new opam package after testing it on your
  desktop, and then wondered if it builds on OpenSUSE or CentOS, or on
  an ARM or PowerPC architecture, or against a different version of the
  OCaml compiler, or if older version continues to work after a few
  years of being published?  But you don't have the resources to check
  all these interactions manually, especially as the opam package
  database now contains thousands of revisions of OCaml source code. The
  new `opam ci' plugin comes to the rescue!  The remainder of this post
  describes its uses, how to triage issues and then fix them.

  `opam-ci' provides an interface to the opam2 continuous integration
  cluster, which regularly rebuilds the full package repository across a
  variety of OCaml compiler versions, operating system distributions and
  CPU architectures. These builds are done regularly in remote
  infrastructure and the results are pushed to a [metadata repository]
  where they are fetched by a CLI client to let you query the status of
  your packages.

  • `opam ci status' shows a dashboard of the build results across this
    matrix. Packages can be filtered by maintainer substrings or tag
    names in the opam package description, so you see only those
    relevant to you.

  • `opam ci logs' will show you the build errors so you can fix
    them. It also generates a Dockerfile of the precise build to
    reproduce the environment locally for you.

  To get started, try these commands with the maintainer argument
  replaced with your own information or tags:

  ┌────
  │ # show all the failing MirageOS packages
  │ opam ci status -m org:mirage | less -R
  │ # show all the packages maintained by anil at recoil.org
  │ opam ci status -m anil at recoil.org --filter=all | less -R
  │ # show all the packages failing on the latest RC of the OCaml compiler
  │ opam ci status --filter=variants:rc | less -R
  │ # display all failure logs for the mirage-xen package
  │ opam ci logs mirage-xen
  └────

  The status view shows a panel of icons that represent different
  combinations of ways to build opam packages. From left to right, these
  are:

  • /Compiler:/ The circled numbers represent OCaml compiler versions (a
    circled 6 is OCaml 4.06, a circled 7 is 4.07, and so on).
  • /Distro/: The square letters indicate different OS distributions. D
    is Debian, F is Fedora, A is Alpine, U is Ubuntu and S is OpenSUSE.
  • /CPU Architecture/: The small circled letters represent different
    CPU architectures. x represents x86_64, a is arm64 and p is
    PowerPC64LE.

  Some compiler variants are also tested to track down specific
  problems, shown by the icons to the far right of the display. (see
  [below](#fix-specific-issues-around-ocaml-features) for more
  information on these).

  • /safe-string/: The ss icon is for 'safe-string' failures, which
    would happen in OCaml 4.06 due to the switch to immutable strings.
  • /flambda/: The fl icon is for packages that fail to compile with the
    flambda variant of the compiler.
  • /release-candidate/: The flag icon is for packages that fail to
    compile with the latest release candidate of OCaml; this is useful
    to figure out how much of the ecosystem works with a
    soon-to-be-released compiler.

  The colours indicate the result of the build: white indicates the
  package was not built due to constraints, green is a successful build,
  yellow indicates the build was skipped due to a dependency failure,
  red is a direct build failure of that package, and magenta and blue
  indicate package metadata errors such as a failure of the solver to
  find a solution or the package sources being unavailable. /(note:
  colors are currently mandatory but this [needs to be improved])/


[metadata repository] https://github.com/ocaml/obi-logs

[needs to be improved] https://github.com/ocaml/obi/issues/6

Uses
────

Check your own package builds
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌

  See all failing builds by specifying the maintainer:

  ┌────
  │ opam ci status -m anil at recoil.org | less -R
  └────

  See all builds, including successes:

  ┌────
  │ opam ci status -m anil at recoil.org -f all | less -R
  └────


Check on a project's libraries
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌

  You can specify additional `-m' fields, which match based on the
  `maintainer:' or `tags:' field in the opam metadata.  For example, the
  [MirageOS] uses `org:mirage' in its tags to group libraries:

  ┌────
  │ opam ci status -m org:mirage | less -R
  └────


[MirageOS] https://mirage.io


Package you have forgotten about
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌

  Sometimes you constrain a package due to an incompatibility with a
  newer version of OCaml, but then forget to release a new version.

  You can query for "lagging" packages whose latest version is
  incompatible with the latest release of OCaml due to constraints:

  ┌────
  │ opam ci status -f lagging | less -R
  └────


Fix specific issues around OCaml features
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌

  Newer releases of OCaml come with some backwards incompatible changes.
  You can find packages with some of those particular problems.


◊ Migration to safe-string

  OCaml shifted from mutable to immutable strings by default in OCaml
  4.06, but there is a variant of the compiler with the old behaviour.
  You can list packages which break with the new immutable default, but
  that work with the older setting.

  ┌────
  │ opam ci status -f variants:ss | less -R
  └────


◊ Flambda inliner compilation

  There is an experimental inliner available with the `flambda'
  configure time variant of the compiler. A few packages fail to compile
  with the new option, so you can list those explicitly to determine
  what's wrong:

  ┌────
  │ opam ci status -f variants:fl | less -R
  └────


◊ Testing on trunk / release candidate OCaml

  When there are release candidates for OCaml, it is helpful to test
  packages on those pre-release versions. You can find packages that
  compile successfully on a stable release but fail on the bleeding edge
  compiler:

  ┌────
  │ opam ci status -f variants:rc | less -R
  └────

  Note that this shows actual build failures.  You can use the "lagging"
  filter to find packages that have been constrained to prevent them
  from being compiled on the latest version entirely, which is useful to
  figure out what needs porting.

  ┌────
  │ opam ci status -f lagging | less -R
  └────


Community service
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌

  You can find all unmaintained packages that might seem some assistance
  since their maintainer fields are blank:

  ┌────
  │ opam ci status -f orphaned | less -R
  └────


Identifying issues
──────────────────

  Once you have identified a package that is failing, you can inspect
  the build logs to figure out how to fix the issue.

  Firstly, use `opam ci logs' to find out what's wrong.  For example, I
  might run this on the `xen-gnt-unix' package.

  ┌────
  │ $ opam ci logs xen-gnt-unix
  │ xen-gnt-unix: multiple build failures found with different configuration parameters.
  │ Please refine the command to select exactly one of the following:
  │   opam-ci logs xen-gnt-unix.3.0.0 --compiler=4.06 --arch=amd64 --distro=ubuntu-18.04
  │   opam-ci logs xen-gnt-unix.3.0.0 --compiler=4.06 --arch=amd64 --distro=fedora-28
  │   opam-ci logs xen-gnt-unix.3.0.0 --compiler=4.06 --arch=amd64 --distro=debian-9
  │   opam-ci logs xen-gnt-unix.3.0.0 --compiler=4.06+flambda --arch=amd64 --distro=debian-9
  │   opam-ci logs xen-gnt-unix.3.0.0 --compiler=4.06+default-unsafe-string --arch=amd64 --distro=debian-9
  │   opam-ci logs xen-gnt-unix.3.0.0 --compiler=4.05 --arch=amd64 --distro=debian-9
  │   opam-ci logs xen-gnt-unix.3.0.0 --compiler=4.04 --arch=amd64 --distro=debian-9
  │   opam-ci logs xen-gnt-unix.3.0.0 --compiler=4.06 --arch=amd64 --distro=alpine-3.7
  │   opam-ci logs xen-gnt-unix.3.0.0 --compiler=4.06 --arch=ppc64le --distro=debian-9
  │   opam-ci logs xen-gnt-unix.3.0.0 --compiler=4.06 --arch=arm64 --distro=debian-9
  │   opam-ci logs xen-gnt-unix.3.0.0 --compiler=4.06 --arch=amd64 --distro=opensuse-42.3
  │   opam-ci logs xen-gnt-unix.3.0.1 --compiler=4.06 --arch=ppc64le --distro=debian-9
  │   opam-ci logs xen-gnt-unix.3.0.1 --compiler=4.06 --arch=amd64 --distro=opensuse-42.3
  └────

  If just one failure is found, then the build logs are shown for that
  failure. If there is more than one failure, the output will give you a
  more precise command line to enter to select just one of the failures,
  as shown above.

  Just pick the first one, and the output shows us the abbreviated
  failure log, and some metadata such as which git revision of the
  [opam-repository ([https://github.com/ocaml/opam-repository]) the
  package was built against.

  ┌────
  │ opam-ci logs xen-gnt-unix.3.0.0 --compiler=4.06 --arch=amd64 --distro=ubuntu-18.04
  │ ====> xen-gnt-unix.3.0.0 4.06 Ubuntu 18.04 amd64 (exit code 31) (opam-repository 8425e617):
  │ <snip>
  │ ### output ###
  │ # File "/home/opam/.opam/4.06/lib/io-page/META", line 1, characters 0-0:
  │ # Error: Library "io-page-unix" not found.
  │ # -> required by library "io-page.unix" in /home/opam/.opam/4.06/lib/io-page
  │ # Hint: try: jbuilder external-lib-deps --missing -p xen-gnt-unix @install
  └────

  This then lets you hopefully see a path to fixing the issue.


Fixing issues
╌╌╌╌╌╌╌╌╌╌╌╌╌

  The problems you find can range from a few root causes. If you think
  of more, please add them here by updating the [wiki page] or posting
  to the discussion forum.


[wiki page]
https://github.com/ocaml/infrastructure/wiki/Using-the-opam-ci-tool/_edit

◊ Incorrect opam package constraints

  If a package used to build but subsequently starts failing, it is
  probably because some dependencies have changed their interfaces. You
  can use opam package constraints to fix this by identifying which the
  offending dependency is from the build failure, and modifying your
  package to only select

  /Feature: [#5] tracks including dependency information into the
  opam-ci metadata directly./

  A package occasionally also becomes uninstallable due to dependency
  constraints resulting in an impossible situation.  This is normally
  caught by the opam repository maintainers, but mistakes slip through.
  In this case, you'll need to figure out the constraints that let your
  package install.

  /Feature: [#7] tracks including `opam lint' output in opam-ci status
  to make finding these problems easier./


  [#5] https://github.com/ocaml/obi/issues/5

  [#7] https://github.com/ocaml/obi/issues/7


◊ OCaml compiler version

  OCaml now releases on a 6-8 month release schedule, and the march of
  progress occasionally breaks existing code.  In this case, maintainers
  can release a new version of their package that works, but older
  releases are still tracked in opam and should be constrained to
  prevent them being selected by the new compiler.

  One example is the migration to safe-string, which broke a large
  number of packages out of the box in OCaml 4.06.0.  In this case, you
  might see an issue like this:

  ┌────
  │ $ opam-ci logs syslog.1.4 --compiler=4.06 --arch=amd64 --distro=debian-9
  │ # File "syslog.ml", line 196, characters 50-53:
  │ # Error: This expression has type bytes but an expression was expected of type
  │ # string
  └────

  In this case, you need to prevent this package from being installed on
  OCaml 4.06.0 or higher, and release a new version of the package with
  the functionality fixed. The opam1 constraint looks like:

  ┌────
  │ available: [ ocaml-version < "4.06.0" ]
  └────


◊ Operating System portability

  A very common situation is that you test your package on your local
  desktop, but cannot try it on the huge number of Linux distributions
  out there.  Thanks to the magic of Docker containers, the opam-ci
  shows build information on many distributions: Ubuntu, Debian, CentOS,
  Alpine, OpenSUSE and OracleLinux across several versions (the full
  list is [here]).

  To pick on an example of `zstd', the `opam ci status zstd' shows that
  it builds on Debian and Ubuntu, but fails on CentOS and Alpine.
  Inspecting the opam file reveals why:

  ┌────
  │ $ opam show zstd --raw
  │ <snip>
  │ depexts: [
  │   ["libzstd-dev"] {os-distribution = "debian"}
  │   ["libzstd-dev"] {os-distribution = "ubuntu"}
  │ ]
  └────

  The `depexts' field is driven by [opam-depext] which understands a
  large number of operating systems.  You can fix this by including the
  packages for Alpine and CentOS and submitting the fixes.  The
  opam-repository CI will test your submitted fixes against the matrix
  of operating systems and verify if the fix worked or not, or you can
  use [Docker locally] via the [OCaml containers](Containers) before
  submitting the fix.


  [here]
  https://github.com/avsm/ocaml-dockerfile/blob/master/src-opam/dockerfile_distro.mli#L25

  [opam-depext] https://github.com/ocaml/opam-depext/tree/2.0

  [Docker locally] https://www.docker.com/docker-mac


◊ CPU portability

  OCaml runs on a variety of CPU architectures, but most of us develop
  on x86. The bulk builds also run regularly on arm64 and ppc64le, which
  exposes portability bugs in C bindings quite often.

  The AFL testing system fails on ARM for example:

  ┌────
  │ opam-ci logs afl.2.52b --compiler=4.06 --arch=arm64 --distro=debian-9
  │  ### output ###
  │  # [*] Checking for the ability to compile x86 code...
  │  # /tmp/cctyEiSt.s: Assembler messages:
  │  # /tmp/cctyEiSt.s:10: Error: unknown mnemonic `xorb' -- `xorb %al,%al'
  │  #
  │  # Oops, looks like your compiler can't generate x86 code.
  │  #
  │  # Don't panic! You can use the LLVM or QEMU mode, but see docs/INSTALL first.
  │  # (To ignore this error, set AFL_NO_X86=1 and try again.)
  └────

  In this case, you can fix the portability issue in your package and
  release a new version.  To prevent the older (already released)
  packages from being selected by the opam solver on that architecture,
  you can add a `cpu' constraint in the `available:' field.  An example
  is the `yaml.0.2.0' package that was broken on PowerPC and fixed in
  `yaml.0.2.1':

  ┌────
  │ $ opam show yaml.0.2.0 --raw
  │ <snip>
  │ available: arch != "ppc64"
  └────


Contributions
─────────────

  We would love to see more contributions to opam-ci and the associated
  infrastructure. The most obvious way you can get involved is by
  looking at the build failures and submitting fixes to the
  [opam-repository] to help us maintain the rapidly growing package
  database.

  If you would like to work on the CLI tool itself, then feel free to
  get started and look at the [issue list] and the [contributions
  guidelines] to get started, and/or post on the [OCaml discussion
  forum]. You can also add more triaging tips to this wiki to help other
  users.




  ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――


[opam-repository] https://github.com/ocaml/opam-repository

[issue list] https://github.com/ocaml/obi/issues

[contributions guidelines]
https://github.com/ocaml/obi/blob/master/CONTRIBUTING.md

[OCaml discussion forum] https://discuss.ocaml.org


Does OCaml ecosystem have CSS preprocessors?
════════════════════════════════════════════

  Archive:
  [https://discuss.ocaml.org/t/does-ocaml-ecosystem-have-css-preprocessors/2139/3]

  /Volodymyr Melnyk asked and Nadeem Bitar replied:/


        Does OCaml's ecosystem have CSS preprocessors except CCSS
        (cause I want to write CSS in OCaml)?

  I've used [bs-css] to write CSS in OCaml.

  It allows you to write something like:

  ┌────
  │ open CSS
  │ let card = style
  │ [
  │   display flexBox;
  │   flexDirection column;
  │   boxShadow ~y:(px 3) ~blur:(px 5) (rgba 0 0 0 0 0.3);
  │ ]
  └────




  ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――


[bs-css] https://github.com/SentiaAnalytics/bs-css


Old CWN
═══════

  If you happen to miss a CWN, you can [send me a message] and I'll mail
  it to you, or go take a look at [the archive] or the [RSS feed of the
  archives].

  If you also wish to receive it every week by mail, you may subscribe
  [online].
  ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
  [Alan Schmitt]


[send me a message] mailto:alan.schmitt at polytechnique.org

[the archive] http://alan.petitepomme.net/cwn/

[RSS feed of the archives] http://alan.petitepomme.net/cwn/cwn.rss

[online] http://lists.idyll.org/listinfo/caml-news-weekly/

[Alan Schmitt] http://alan.petitepomme.net/

-- 
OpenPGP Key ID : 040D0A3B4ED2E5C7
Monthly Athmospheric CO₂, Mauna Loa Obs. 2018-05: 411.25, 2017-05: 409.65
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 528 bytes
Desc: not available
URL: <http://lists.idyll.org/pipermail/caml-news-weekly/attachments/20180619/bbfc62a8/attachment-0001.pgp>


More information about the caml-news-weekly mailing list