# self-extract

A Haskell library that can make an executable self-extracting.

## Usage

### .cabal file

```
...
build-type: Custom
...

custom-setup
  setup-depends: base, Cabal, self-extract

...

executable name-of-executable
  build-depends: self-extract, ...
  ...
```

### Setup.hs

```
import Codec.SelfExtract.Distribution (bundle)
import Distribution.Simple

main = defaultMainWithHooks simpleUserHooks
  { postCopy = \args cf pd lbi -> do
      postCopy simpleUserHooks args cf pd lbi
      bundle "name-of-executable" "dir-to-bundle" lbi
  }
```

### Executable file

```
import Codec.SelfExtract (extractTo)

main = do
  extractTo "dir" -- will extract to $CWD/dir
  extractTo "/usr/local/lib"
  ...
```

Extract to a temporary directory:

```
import Codec.SelfExtract (withExtractToTemp)
import System.Directory (removeDirectory)

main = do
  withExtractToTemp $ \tmp -> do
    ...
```

### Details

The above instructions should be a black box, but here is an explanation of the implementation
if you need to know the details of how it works.

When the executable containing `extractTo` is built, some space will be allocated to contain the
size of the binary.

`bundle` will find the executable from `LocalBuildInfo`'s `buildDir`. It will take the directory
specified and run `tar` on it. It will also get the size of the executable and write the size into
the space allocated by `extractTo`. Then `bundle` will replace the executable with the executable
itself concatenated with the tar archive.

When `extractTo` is called, it will read the size of the executable that was written in `bundle`.
After seeking to the size of the binary, the tar archive can be extracted to the desired directory.