## Indexing Verible C++ Source Code using Kythe

If you are looking for a searchable/indexed interface into Verible's source
code, this is already deployed at https://cs.opensource.google/verible/verible.

If you would like to learn how manually index the source code yourself, perhaps
for offline work, then read on. The steps mentioned here can be generalized for
indexing Bazel-based projects.

More information about indexing Bazel-based projects using Kythe
[here](https://github.com/kythe/kythe/tree/master/kythe/cxx/extractor#bazel-c-extractor).

### Initializing Kythe

Download the latest Kythe release from https://github.com/kythe/kythe/releases
and then unpack it for a snapshot of Kythe’s toolset.

```bash
tar xzf kythe-v*.tar.gz
rm -rf /opt/kythe
mv kythe-v*/ /opt/kythe
```

More information can be found
[here](https://github.com/kythe/kythe#getting-started).

Clone Kythe from [here](https://github.com/kythe/kythe). Then from within the
Kythe clone, build the web frontend and copy its files into /opt/kythe/

```bash
bazel build //kythe/web/ui
mkdir -p /opt/kythe/web/ui
cp -r bazel-bin/kythe/web/ui/resources/public/* /opt/kythe/web/ui
cp -r kythe/web/ui/resources/public/* /opt/kythe/web/ui
chmod -R 755 /opt/kythe/web/ui
```

More information can be found
[here](https://github.com/google/haskell-indexer#building-from-source).

### Extracting Compilations for Verible

#### VNames.json File

`vnames.json` file is used for renaming certain filepaths during extraction, but
renaming isn’t needed here but you can add the renaming you find suitable.

#### Run the extractor

```bash
# run on all targets
bazel test --experimental_action_listener=:extract_cxx  //...

# run on specific target (e.g. some cc_binary or cc_library)
bazel test --experimental_action_listener=:extract_cxx //verilog/analysis:default_rules
```

Extracted kzip files will be in
bazel-out/local-fastbuild/extra_actions/extractor folder. One kzip file per
target.

```bash
find -L bazel-out -name '*cxx.kzip'
```

More information can be found
[here](https://github.com/kythe/kythe/tree/master/kythe/cxx/extractor).

### Indexing Extracted Kzip Files and Generating GraphStore

For extracting the indexing facts from extracted `kzip` files, run the following
command to apply the indexing for each `kzip` file and generate the result into
`kythe graphstore`.

```bash
for i in $(find -L bazel-out -name '*cxx.kzip'); do
    # Indexing C++ compilations
    /opt/kythe/indexers/cxx_indexer --ignore_unimplemented "$i" > entries

    # Write entry stream into a GraphStore
    /opt/kythe/tools/write_entries --graphstore leveldb:.kythe_graphstore < entries
done
```

### Generating Serving Tables

```bash
# Generate corresponding serving tables
/opt/kythe/tools/write_tables --graphstore .kythe_graphstore --out .kythe_serving
```

### Visualizing Cross-References

Run Kythe's `UI` to visualize cross-reference and code navigation.

```bash
# --listen localhost:8080 allows access from only this machine; change to
# --listen 0.0.0.0:8080 to allow access from any machine
/opt/kythe/tools/http_server \
  --public_resources /opt/kythe/web/ui \
  --listen localhost:8080 \
  --serving_table .kythe_serving
```
