Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
105 lines (81 sloc) 2.9 KB
id title
Workflow for C/C++ Packages

esy providing a workflow for native development couldn't skip supporting C/C++ packages as C/C++ libraries/tools are so widespread.

There are numerous examples of Reason/OCaml code using C/C++ code via FFI: bindings to libcurl, SDL, OpenGL and so on and so on.

The easiest way to expose some C/C++ code between esy packages is with pkg-config.

Exposing C library with pkg-config

Let's consider a C library called dep which is going to be consumed as an dep esy package.

First we need to write dep.pc file which contains pkg-config configuration file for our lib.

We do this via Makefile with build and install targets:

define dep_pc

Name: dep
Description: The dep library
Version: 1.0.0
Cflags: -I$${includedir}
Libs: -L$${libdir} -ldep
export dep_pc

  ... build commands ...

  ... other install commands ...
  echo "$$dep_pc" > $(cur__install)/lib/dep.pc

Note that we have installed out dep.pc into $cur__install/lib, we need to update $PKG_CONFIG_PATH with this in "esy.exportedEnv":

  "name": "dep",
  "version": "1.0.0",
  "esy": {
    "build": "make build",
    "install": "make install",
    "exportedEnv": {
      "PKG_CONFIG_PATH": {
        "val": "#{self.lib : $PKG_CONFIG_PATH}",
        "scope": "global"

In the package.json above #{self.lib} is the same value as $cur__install/lib but represented via esy's command expression syntax.


If you are porting some C/C++ library into esy then it is most likely this library already has *.pc file present. Then you need only to make sure you update $PKG_CONFIG_PATH in the package.json corresponding to the library.

Consuming C library with pkg-config

To link a C library exposed with pkg-config a project must depend on that library and on pkg-config package which is hosted on GitHub at esy-packages/pkg-config.

The entire package.json for the project would look like this:

  "name": "my-project",
  "esy": {
    "build": "make build",
    "install": "make install"
  "dependencies": {
    "dep": "1.0.0",
    "pkg-config": "esy-packages/pkg-config"

The Makefile will contain a call to pkg-config to generate command line options for C compiler needed to compile against a library dep and link it to the final executable:

  cc $(shell pkg-config --cflags --libs dep) \
     -o $(cur__target_dir)/main main.c

This is the entire workflow needed to work with C/C++ code with esy.