项目作者: tweag

项目描述 :
Turn dynamically linked ELF binaries and libraries into self-contained closures.
高级语言: Starlark
项目地址: git://github.com/tweag/clodl.git
创建时间: 2017-01-28T13:01:27Z
项目社区:https://github.com/tweag/clodl

开源协议:Other

下载


clodl: self-contained dynamic libraries

Build

clodl computes the closure of a shared object. That is, given
an executable or shared library, it returns a single self-contained
file packing all dependencies. Think of the result as a poor man’s
container image. Compared to containers:

  • closures do not provide isolation (e.g. separate process,
    network, filesystem namespaces),
  • but closures do allow for deploying to other machines without
    concerns about missing dependencies.

Clodl can be used to build binary closures or library closures.

A binary closure is made from an executable or a shared library
defining symbol main and can be executed. In practice, the binary
closure is a zip file appended to a script that uncompresses the file
to a temporary folder and has main invoked.

A library closure is a zip file containing the shared libraries in
the closure, and provides one or more top-level libraries which depends on all of
the others. When the closure is uncompressed, these top-level libraries
can be loaded into the address space of an existing process.

Executing a closure in the address space of an existing process
enables lightweight high-speed interop between the closure and the
rest of the process. The closure can natively invoke any function in
the process without marshalling/unmarshalling any arguments, and vice
versa.

Example of binary closure

clodl is implemented as a set
of Bazel build rules. It integrates with your
Bazel build system, e.g. as follows:

  1. cc_binary(
  2. name = "hello-cc",
  3. srcs = ["main.c"],
  4. deps = ...
  5. )
  6. binary_closure(
  7. name = "hello-closure-bin",
  8. src = "hello-cc",
  9. )

With Haskell:

  1. haskell_binary(
  2. name = "hello-hs",
  3. srcs = ["src/test/haskell/hello/Main.hs"],
  4. ...
  5. )
  6. binary_closure(
  7. name = "hello-closure-bin",
  8. src = "hello-hs",
  9. )

The test BUILD file has complete examples.

Example of library closure

clodl is useful for “jarifying” native binaries. Provided shim Java
code, closures can be packed inside a JAR and then loaded at runtime
into the JVM. This makes JAR’s an alternative packaging format to
publish and deploy native binaries.

  1. cc_binary(
  2. name = "libhello.so",
  3. srcs = ["main.c"],
  4. linkshared = 1,
  5. deps = ...
  6. )
  7. library_closure(
  8. name = "hello-closure",
  9. srcs = ["libhello.so"],
  10. )
  11. java_binary(
  12. name = "hello-jar",
  13. classpath_resources = [":hello-closure"],
  14. main_class = ...,
  15. srcs = ...,
  16. runtime_deps = ...,
  17. )

Importing clodl

In the WORKSPACE file:

  1. http_archive(
  2. name = "io_tweag_clodl",
  3. sha256 = "1181131b0fc111a1f16f0532605e9835e308ac5bc278b62f825adb0844ff7590",
  4. strip_prefix = "clodl-0a7a2f93f4043a2db623f7d820578e3baea228d1",
  5. urls = ["https://github.com/tweag/clodl/archive/0a7a2f93f4043a2db623f7d820578e3baea228d1.tar.gz"],
  6. )
  7. ...

In BUILD files:

  1. load(
  2. "@io_tweag_clodl//clodl:clodl.bzl",
  3. "binary_closure",
  4. "library_closure",
  5. )
  6. ...

Building it

Requirements:

  • The Bazel build tool;
  • the Nix package manager;
  • in Linux, the scanelf tool from the pax-utils package and the patchelf tool;
  • in OSX, otool and install_name_tool.

To build and test:

  1. $ bazel build //...
  2. $ (cd tests; bazel run hello-java)

License

Copyright (c) 2015-2018 EURL Tweag.

All rights reserved.

clodl is free software, and may be redistributed under the terms
specified in the LICENSE file.

About

clodl is maintained by Tweag I/O.

Have questions? Need help? Tweet at
@tweagio.