# Overview

libWeave is the library with device side implementation of Weave protocol.

# Sources

Sources are located in git repository at
https://weave.googlesource.com/weave/libweave/


# Install Repo

Make sure you have a bin/ directory in your home directory
and that it is included in your path:

```
mkdir ~/bin
PATH=~/bin:$PATH
```

Download the [Repo tool](https://gerrit.googlesource.com/git-repo) and ensure
that it is executable:

```
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
```

# Checkout code

```
mkdir ~/weave
cd ~/weave
repo init -u https://weave.googlesource.com/weave/manifest
repo sync
```

This checks out libweave and its dependencies into the ~/weave directory.

# libweave Directory structure

| Path                     | Description                        |
|--------------------------|------------------------------------|
| include/                 | Includes to be used by device code |
| src/                     | Implementation sources             |
| examples/                | Example of device code             |
| third_party/             | Dependencies                       |
| Makefile, \*.mk files    | Build files                        |


# Quick start on Debian/Ubuntu

### Install prerequisites

```
sudo apt-get update
sudo apt-get install \
  autoconf \
  automake \
  binutils \
  cmake \
  g++ \
  hostapd \
  libavahi-client-dev \
  libcurl4-openssl-dev \
  libevent-dev \
  libexpat1-dev \
  libssl-dev \
  libtool
```

# Prerequisites

### Common

  - autoconf
  - automake
  - binutils
  - libtool
  - libexpat1-dev

### For tests

  - cmake
  - gtest (included; see third_party/googletest/googletest/)
  - gmock (included; see third_party/googletest/googlemock/)

### For examples

  - cmake
  - hostapd
  - libavahi-client-dev
  - libcurl4-openssl-dev
  - libevhtp (included; see third_party/libevhtp/)
  - libevent-dev

# Compiling

From the `libweave` directory:

The `make --jobs/-j` flag is encouraged, to speed up build time. For example

```
make -j
```

which happens to be the same as

```
make all -j
```

### Build library

```
make out/Debug/libweave.so
```

### Build examples

```
make all-examples
```

See [the examples README](/examples/daemon/README.md) for details.

### Cross-compiling

#### libweave users

In order to cross-compile, all you need to configure is CC/CXX/AR.

```
make CC=your-cc CXX=your-cxx AR=your-ar
```

So if you have a toolchain in a path like `/opt/vendor/bin/arm-linux-gcc`, do:

```
make \
  CC=/opt/vendor/bin/arm-linux-gcc \
  CXX=/opt/vendor/bin/arm-linux-g++ \
  AR=/opt/vendor/bin/arm-linux-ar
```

#### libweave developers

*** note
**Note:** This is only for developers who are hacking on libweave itself.
***

The build supports transparently downloading & using a few cross-compilers.
Just add `cross-<arch>` to the command line in addition to the target you
want to actually build.

This will cross-compile for an armv7 (hard float) target:

```
make cross-arm all-libs
```

This will cross-compile for a mips (little endian) target:

```
make cross-mipsel all-libs
```

# Testing

### Run tests

```
make test
make export-test
```

or

```
make testall
```

### Cross-testing

The build supports using qemu to run non-native tests.

This will run armv7 tests through qemu:

```
make cross-arm testall
```

# Making changes

The [Android Developing site](https://source.android.com/source/developing.html)
has a lot of good tips for working with git and repo in general.  The tips below
are meant as a quick cheat sheet rather than diving deep into relevant topics.

### Configure git
Make sure to have correct user in local or global config e.g.:

```
git config --local user.name "User Name"
git config --local user.email user.name@example.com
```

### Start local branch

```
repo start <branch name> .
```

### Edit code and commit locally e.g.

```
git commit -a -v
```

### Upload CL

```
repo upload .
```

### Request code review

Go to the url from the output of `repo upload` and add reviewers.
