Git Product home page Git Product logo

lolcate-rs's Introduction

Lolcate

Crates.io

A comically fast way of indexing and querying your filesystem. Replaces locate / mlocate / updatedb. Written in Rust.

Lolcate is a fast, lightweight, versatile alternative to locate / mlocate / updatedb.

It features:

  • indexing rules allowing you to easily specify which path names to index and which ones to prune ;
  • powerful, UTF8-compliant querying rules ;
  • the ability to create multiple databases for multiple purposes.

Lolcate comes as a single binary executable.

Lolcate doesn't try to be compatible with mlocate / updatedb.

Synopsis

Lolcate operates in two phases:

  1. It indexes parts of your filesystem by obeying some indexing rules you specified to populate one of its databases with the list of matching path names.

    Only the path names of the files are indexed, Lolcate isn't concerned with their contents.

    Different databases can be created for different purposes.

  2. Whenever needed, you can run lolcate to perform queries against its databases and it will return the path names matching the querying rules you specified.

The same lolcate binary executable performs both indexing and querying.

Suggested use

Use shell aliases and functions to query your databases to your liking, e.g.

alias d='lolcate --db documents'

alias zik='lolcate --db music --type audio'
z(){ mpv --playlist <(zik $1); }
zs(){ mpv --playlist <(zik $1|shuf); }

Guide

Creating a database

Before using Lolcate, a database needs to be created. Let's create one:

$ lolcate --create
Created database 'default'.
Please edit:
- the configuration file: /home/ngirard/.config/lolcate/default/config.toml
- the ignores file:       /home/ngirard/.config/lolcate/default/ignores

Since we didn't specify the name of the database, Lolcate chose the name default. We could have specified the name of the database using lolcate --create --db <db_name>.

Indexing rules: specifying what to index

Next, we need to specify what to index by editing two files (this might change in a future version), the config.toml file and the ignores file.

The config.toml file doesn't come empty but filled with boilerplate contents you'll need to customize. It should look like this:

description = ""

# Directories to index.
dirs = [
  # "~/first/dir",
  # "/second/dir"
]

# Set to "Dirs" or "Files" to skip directories or files.
# If unset, or set to "None", both files and directories will be included.
# skip = "Dirs"

# Set to true if you want skip symbolic links
ignore_symlinks = false

# Set to true if you want to index hidden files and directories
ignore_hidden = false

# Set to true to read .gitignore files and ignore matching files
gitignore = false

Let's modify it and add two directories for indexing:

dirs = [
  "~/Images",
  "~/Documents"
]

As you noticed, the directories must be quoted and comma-separated. Also, tildes in directories are expanded, but not environment variables.

We can choose to index only files by setting skip = "Dirs", and only directories by setting skip = "Files". Additionally, symbolic links and hidden files and directories can be skipped by setting ignore_symlinks = true and ignore_hidden = true respectively.

The ignores file contains patterns Lolcate will use to ignore matching path names while indexing the filesystem. The syntax of the ignores file is the same as for the .gitignore files. You can leave it empty if you want to index everything according to the config.toml file.

Let's modify it and add these two patterns:

.git
*~

Indexing the filesystem

Now, we are ready to tell Lolcate to index the filesystem according to the rules we just specified:

$ lolcate --update
Updating default...

Again, Lolcate updates the default database by default. We can choose to update another one by typing lolcate --update --db <other_db>. We can also ask Lolcate to update all the databases we have by typing lolcate --update --all.

Querying a database

Now that our database is populated, we can run queries against it.

  • The simplest form is just lolcate [--db <dbname>]:

    $ lolcate
    /home/ngirard/Images/DCIM_101CANON/_MG_0006.jpg
    /home/ngirard/Images/DCIM_101CANON/_MG_0007.jpg
    /home/ngirard/Images/DCIM_101CANON/_MG_0004.jpg
    (...)

    When no pattern is given, the query returns everything from the database.

    lolcate --all will return everything from all of your databases.

  • We might also want to specify a pattern by running lolcate [--db <dbname>] <pattern>:

    $ lolcate 2018
    /home/ngirard/Images/2018/01/9/IMG_1057.JPG
    /home/ngirard/Images/2018/01/9/IMG_1059.JPG
    /home/ngirard/Images/2018/01/9/IMG_1060.JPG
    (...)
  • Patterns are interpreted as regular expressions.

    For instance, let's look for any path names containing either 2018 or 2019:

    $ lolcate 201[89]
    /home/ngirard/Images/2018/01/9/IMG_1057.JPG
    /home/ngirard/Images/2018/01/9/IMG_1059.JPG
    (...)
    /home/ngirard/Images/2019/01/9/IMG_1055.JPG
    /home/ngirard/Images/2019/01/9/IMG_1058.JPG
    (...)

    The complete syntax for the regex engine used by Lolcate is available here.

  • Multiple patterns can be specified using lolcate <pattern1> <pattern2> ....

    For instance, let's look for all readme files from the Images directory:

    $ lolcate Images readme
    /home/ngirard/Images/DCIM_101CANON/readme.txt
    /home/ngirard/Images/2019/01/1/Readme
    /home/ngirard/Images/2018/01/1/readme
  • The search for patterns is "smart-case" by default. It means that patterns are searched case-insensitively when all in lowercase, and sensitively otherwise.

    For instance, running the latest query with "Readme" instead of "readme" gives:

    $ lolcate Images Readme
    /home/ngirard/Images/2019/01/1/Readme

    We can perform a case-insensitive search using the -i | --case-insensitive option:

    $ lolcate -i Images README
    /home/ngirard/Images/DCIM_101CANON/readme.txt
    /home/ngirard/Images/2019/01/1/Readme
    /home/ngirard/Images/2018/01/1/readme
    /home/ngirard/Documents/READMEs/2018-05-15-Cropping_images.txt
    /home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig1.jpg
    /home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig2.png
  • A pattern can be matched against the base name of path names only, using the -b | --basename option:

    $ lolcate -b images
    /home/ngirard/Documents/READMEs/2018-05-15-Cropping_images.txt
    /home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig1.jpg
    /home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig2.png
  • Path types can be defined and queried for.

    Path types can be defined by adding them to Lolcate's global configuration file. We can locate this file by invoking the --info option:

    $ lolcate --info
    Config file:
    /home/ngirard/.config/lolcate/config.toml
    (...)

    The following path types are predefined:

    [types]
    img = ".*\\.(jp.?g|png|gif|JP.?G)$"
    video = ".*\\.(flv|mp4|mp.?g|avi|wmv|mkv|3gp|m4v|asf|webm)$"
    doc = ".*\\.(pdf|chm|epub|djvu?|mobi|azw3|odf|ods|md|tex|txt)$"
    audio = ".*\\.(mp3|m4a|flac|ogg)$"
    

    these path types can be used in queries:

    $ lolcate --type img cropping
    /home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig1.jpg
    /home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig2.png
  • Path name patterns, base name patterns and type patterns can be mixed altogether:

    $ lolcate --basename [eé]conomie --type doc
    /home/ngirard/Documents/Notes/2018-11-12-Economie_politique.tex
    /home/ngirard/Documents/Notes/2019-01-03-Économie_politique.md
    $ lolcate --basename [eé]conomie --type doc 2018
    /home/ngirard/Documents/Notes/2018-11-12-Economie_politique.tex

Where does Lolcate store its files ?

  • the configuration files are stored either in $XDG_CONFIG_HOME/lolcate or in $HOME/.config/lolcate;

  • the database files are stored either in $XDG_DATA_HOME/lolcate or in $HOME/.local/share/lolcate.

Differences with mlocate

The following Locate options do not have an equivalent in Lolcate: --count, --existing, --follow, --transliterate, --limit, --nofollow, --null.

Installation

Using the pre-compiled binaries

This is the easiest and recommended way.

Download the latest lolcate pre-compiled binary from Github into a directory belonging to your PATH.

Pre-compiled binaries are available for Linux, MacOS and Windows.

Installation from sources

  1. If needed, install the current stable release of Rust and Cargo using

    $ curl https://sh.rustup.rs -sSf | sh
  2. If needed, add ~/.cargo/bin to your PATH using e.g.:

    $ export PATH=$HOME/.cargo/bin:$PATH
  3. Run

    $ cargo install lolcate-rs
    

    to compile the sources from the latest release, or

    $ cargo install --git https://github.com/ngirard/lolcate-rs
    

    to compile the latest version of the sources from the GitHub repository.

Contributing

While all contributions are welcome, the ideal contributions for me would be finely-grained pull requests, as they would allow me to improve my Rust literacy while reviewing them. Thanks in advance !

There are a number of areas you might want to consider contributing to:

  • The most needed feature is the colored printout of pattern matches (#13).

  • Lolcate is not yet useable as a library.

  • I'm not satisfied with the ignores rules being kept in a separate configuration file (#14).

  • Testing.

    I'd be very interested in advice on existing code I could reuse / take advantage of in order to provide Lolcate with a complete testing bench.

  • Backend strategy.

    Lolcate currently stores its data as a lz4-compressed list of path names, and recreates it each time lolcate --update is run. It's as simple as you can get. Although it works well enough for my taste, I'd be glad to consider alternatives (#15).

  • Benchmarking

    (#16)

Acknowledgements

  • I wish to thank the Rust community for producing such a great developing environment. It's the best environment I've been working with so far !

  • A big thanks to Andrew Gallant for his tremendous work and the invaluable crates he wrote, which Lolcate relies upon (regex, ignore, walkdir).

  • The approach of simply recreating the database instead of updating it for performance purposes, which Lolcate currently uses, has been discussed multiple times on the Internet. I couldn't find my related notes, so I'd be glad to share any references you could provide.

  • The name "lolcate" has already been used for a prototype shell script published as a Github Gist in 2012. It was too good a name to not reusing it !

  • Credits for the laughing cat image: Rikki's Refuge

lolcate-rs's People

Contributors

alyoshavasilieva avatar cornedbee avatar erjanmx avatar icewind1991 avatar ngirard avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lolcate-rs's Issues

lolcate --update does not handle dangling symbolic links gracefully

When trying to update the database, if a target directory contains a dangling symlink an error message like the following is printed:

Updating /tmp/example...
failed to access entry (/tmp/dangling/nonexistent: IO error for operation on /tmp/dangling/nonexistent: No such file or directory (os error 2))

(This is from indexing /tmp/dangling containing symlink nonexistent/nope)

Built from current master commit f876603, Debian Linux

Windows support

Windows systems are currently not supported.

I'm afraid I won't actively dedicate efforts on this in the near future, but I'd happily accept contributions.

One related issue here is that Lolcate currently relies on the dirs crate for locating configuration and data directories, and it's apparently unmaintained.

Consequently, another crate may need to be used.
There are some recent related threads on r/rust:

Locating files on removable drives

It would be useful to have support for indexing removable drives.
Possibly only searching folders that exist, leaving data about folders that do not exist intact.
Maybe creating separate datafiles for each folder.
Or some other solution that would make indexing removable drives possible.

I have been trying to find a solution for indexing removable drives,
but I have not been able to find anything.
Currently I have been using a custom script using ls and ripgrep, but it's not ideal.

After finding lolcate I think it might be a better solution,
although I would lose file size and creation date.

Consider other backend strategies

Lolcate currently stores its data as a lz4-compressed list of path names, and recreates it each time lolcate --update is run. It's as simple as you can get.

Although it works well enough for my taste, I'd be glad to consider alternatives.

Invalid TOML: missing field `skip` at line 1 column 1

Arch Linux
Lolcate 0.5.0
$ cat .config/lolcate/default/config.toml

description = ""

# Directories to index.
dirs = [
"/"
# "~/first/dir",
# "/second/dir"
]

# Set to either "Dirs" or "Files" to skip directories or files
# skip = "Dirs"

# Set to true if you want skip symbolic links
ignore_symlinks = true

# Set to true if you want to ignore hidden files and directories
ignore_hidden = false
$ lolcate --update
Invalid TOML: missing field `skip` at line 1 column 1

It's solved when I uncomment skip line but if this parameter is mandatory it should be uncommented in the initial file.
On the other hand in the comment created in the initial file it indicates that the values for this parameter are "Set to either "Dirs" or "Files" to skip directories or files" but it does not say anything about the another possible value None.

MacOS testers needed

I believe Lolcate should work gracefully on MacOS, but didn't have a chance to check it.
Pre-built binaries are provided for MacOS with each release.
It would be nice if someone could test them.

Publish to `crates.io` as `lolcate`

Is there some reason this isn't on crates.io as lolcate? If not, it would be great to have it there under that name.

Edit: Found issue #3.

Edit: Apparently I can't read.

Error trying to updatedb

Tried with default config and adding a dir. Used the release binary.
Linux arch 5.6.3-arch1-1 #1 SMP PREEMPT Wed, 08 Apr 2020 07:47:16 +0000 x86_64 GNU/Linux

description = ""

Directories to index.

dirs = [

"~/first/dir",

"/second/dir"

]

Set to either "Dirs" or "Files" to skip directories or files

skip = "Dirs"

Set to true if you want skip symbolic links

ignore_symlinks = false

Set to true if you want to ignore hidden files and directories

ignore_hidden = false

➜ ~ lolcate --update
Invalid TOML: missing field skip at line 1 column 1
➜ ~

How to replace mlocate to index the whole root directory(/)?

I use mlocate to generate db file for the whole root directory (/) using the following command without sudo (defualt /etc/updatedb.conf)

updatedb --require-visibility 0 -o /tmp/mlocate.db

But when I set "/" in dirs = part in config.toml file, and execute lolcate --update, it lists a lot of

failed to access entry xxxx

and it takes a lot of time like it never stops.

So, how can I generate db like mloate for the whole root directory (/)

Panic on Broken Pipe

I tried to pipe the output of lolcate into a simple head command and it panicked when head closed to input after printing the first 10 lines. This could probably be handled a bit more gracefully. Most tools seem to either ignore it completely or exit with a short "broken pipe" error message.

thread 'main' panicked at 'calledResult::unwrap()on anErrvalue: Os { code: 32, kind: BrokenPipe, message: "Broken pipe" }', /home/taladar/.cargo/registry/src/github.com-1ecc6299db9ec823/lolcate-rs-0.9.2/src/main.rs:458:39

Omit error messages when symlinks are broken (ignore_symlinks = false)

when I lolcate --update and set ignore_symlinks = false, there will be some error messages like:

failed to access entry (/usr/share/sidplayfp/kernal: No such file or directory (os error 2))

And

$ ls -l /usr/share/sidplayfp/kernal
lrwxrwxrwx 1 root root 24 May  9  2020 /usr/share/sidplayfp/kernal -> /usr/lib/vice/C64/kernal
$ file /usr/lib/vice/C64/kernel
/usr/lib/vice/C64/kernel: cannot open `/usr/lib/vice/C64/kernel' (No such file or directory)

And there are a lot in my system. So could you please omit this kind of messages when the symlinks are broken?

Sorting of database entries seems off

as mentioned in the title and shown in the screenshot, the entries sorting seems a bit off.
i do wonder is that intentional or is that some sort of bug?
the entries are called via lolcate --db Music --type audio
(installed via AUR)
screenshot 13

Provide performance benchmarks

  • What to benchmark: indexing time / querying time
  • Comparison with mlocale / updatedb would be nice
  • Should be performed against a standardized directory structure. I quick search did not help with finding some reusable prior art.
  • Should be integrated with Github Actions.

Ignore based on filesystem type

Hi, from what I see it doesn't seem possible to ignore entire filesystem types similarly to mlocate's PRUNEFS.
Will this ever be implemented?

Comparison with locate

  • Any performance benchmarks?

    • How fast is lolcate in indexing the filesystem and how fast is it when querying?
    • What is the size of lolcate DB? (it hardly matters though!)
  • Anything missing? as in something that locate can do but lolcate can't?

Does not handle non-UTF8-encodable pathnames

Pathnames containing non-UTF8 characters are not indexed, but instead produce a warning during indexing.

I am investigating a fix, but it looks quite difficult, which is probably why it has not been done previously.

Release on crates.io?

Is this going to be released on crates.io?

It would enable users to install it with cargo install lolcate-rs

Not replacing

How to install it without replacing any locate already installed?

For it to be

updatedb.lolcate

locate.lolcate

lolcate

And not

locate

updatedb

how to use it?

~ > rm -rf .config/lolcate                                                                                          ± master | 27 Sep (1) 05:35:51
removed '.config/lolcate/config.toml'
removed directory '.config/lolcate'
~ > lolcate --create                                                                                                ± master | 27 Sep (1) 05:35:55
Database default already exists
~ > lolcate --update                                                                                                ± master | 27 Sep (1) 05:36:03
Config file not found for database default.
Perhaps you forgot to run lolcate --create default ?
~ > lolcate --create default                                                                                        ± master | 27 Sep (1) 05:36:14
error: The argument '<PATTERN>...' cannot be used with '--create'

USAGE:
    lolcate --create --db <database>

For more information try --help
~ > lolcate --create --db default                                                                                   ± master | 27 Sep (1) 05:36:18
Database default already exists
~ > lolcate --update                                                                                                ± master | 27 Sep (1) 05:36:21
Config file not found for database default.
Perhaps you forgot to run lolcate --create default ?

update: Error: Os { code: 2, kind: NotFound, message: "No such file or directory" }

Arch Linux
Lolcate 0.5.0
$ cat .config/lolcate/default/config.toml

description = ""

# Directories to index.
dirs = [
"/"
# "~/first/dir",
# "/second/dir"
]

# Set to either "Dirs" or "Files" to skip directories or files
skip = "None"

# Set to true if you want skip symbolic links
ignore_symlinks = true

# Set to true if you want to ignore hidden files and directories
ignore_hidden = false
$ lolcate --update
Error: Os { code: 2, kind: NotFound, message: "No such file or directory" }

Lolcate local vs global databases

Trying to create or update the lolcate database with lolcate --db ./example --create or lolcate --db ./example --locate gives an error.

For --create I get

Error: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }

Using the absolute path `pwd`/example works fine.

For --update I get

Config file not found for database ./example.
Perhaps you forgot to run lolcate --create ./example ?

Again, using an absolute path works fine.

Built from current master commit f876603, Debian Linux

Location for data and config files

For now, both data and configuration files are stored in dirs::data_local_dir().

As a result, database-specific configuration and data share the same subdirectory.

Would it be better to split data and configuration files ? I don't have a strong opinion about that.

undefined reference to `LZ4F_compressBound'

 = note: /usr/bin/ld: /home/et/yay/lolcate/src/lolcate-rs-0.5.0/./target/release/deps/lolcate-0c422b79364f8ae2.lolcate.395453hs-cgu.11.rcgu.o: in function `lz4::encoder::EncoderBuilder::build':
          lolcate.395453hs-cgu.11:(.text._ZN3lz47encoder14EncoderBuilder5build17h761481d317cfcbbfE+0xcf): undefined reference to `LZ4F_compressBound'
          /usr/bin/ld: lolcate.395453hs-cgu.11:(.text._ZN3lz47encoder14EncoderBuilder5build17h761481d317cfcbbfE+0x169): undefined reference to `LZ4F_compressBegin'
          /usr/bin/ld: /home/et/yay/lolcate/src/lolcate-rs-0.5.0/./target/release/deps/lolcate-0c422b79364f8ae2.lolcate.395453hs-cgu.11.rcgu.o: in function `lz4::encoder::Encoder<W>::finish':
          lolcate.395453hs-cgu.11:(.text._ZN3lz47encoder16Encoder$LT$W$GT$6finish17h68595dc2fe788cb3E+0x1e): undefined reference to `LZ4F_compressEnd'
          /usr/bin/ld: /home/et/yay/lolcate/src/lolcate-rs-0.5.0/./target/release/deps/lolcate-0c422b79364f8ae2.lolcate.395453hs-cgu.11.rcgu.o: in function `std::io::Write::write_all':
          lolcate.395453hs-cgu.11:(.text._ZN3std2io5Write9write_all17hdf42bda1693e9ab5E+0x68): undefined reference to `LZ4F_compressUpdate'
          /usr/bin/ld: /home/et/yay/lolcate/src/lolcate-rs-0.5.0/./target/release/deps/lolcate-0c422b79364f8ae2.lolcate.395453hs-cgu.8.rcgu.o: in function `<lz4::decoder::Decoder<R> as std::io::Read>::read':
          lolcate.395453hs-cgu.8:(.text._ZN64_$LT$lz4..decoder..Decoder$LT$R$GT$$u20$as$u20$std..io..Read$GT$4read17hdeaf008baaafeaa6E+0xea): undefined reference to `LZ4F_decompress'
          /usr/bin/ld: /home/et/yay/lolcate/src/lolcate-rs-0.5.0/target/release/deps/liblz4-d46eeb2fcfb05ad1.rlib(lz4-d46eeb2fcfb05ad1.lz4.j6jq8md5-cgu.4.rcgu.o): in function `lz4::liblz4::check_error':
          lz4.j6jq8md5-cgu.4:(.text._ZN3lz46liblz411check_error17h03b860105c86077eE+0x14): undefined reference to `LZ4F_isError'
          /usr/bin/ld: lz4.j6jq8md5-cgu.4:(.text._ZN3lz46liblz411check_error17h03b860105c86077eE+0x21): undefined reference to `LZ4F_getErrorName'
          /usr/bin/ld: /home/et/yay/lolcate/src/lolcate-rs-0.5.0/target/release/deps/liblz4-d46eeb2fcfb05ad1.rlib(lz4-d46eeb2fcfb05ad1.lz4.j6jq8md5-cgu.5.rcgu.o): in function `lz4::encoder::EncoderContext::new':
          lz4.j6jq8md5-cgu.5:(.text._ZN3lz47encoder14EncoderContext3new17h8a647bee5710f9b0E+0x1a): undefined reference to `LZ4F_createCompressionContext'
          /usr/bin/ld: /home/et/yay/lolcate/src/lolcate-rs-0.5.0/target/release/deps/liblz4-d46eeb2fcfb05ad1.rlib(lz4-d46eeb2fcfb05ad1.lz4.j6jq8md5-cgu.5.rcgu.o): in function `<lz4::encoder::EncoderContext as core::ops::drop::Drop>::drop':
          lz4.j6jq8md5-cgu.5:(.text._ZN70_$LT$lz4..encoder..EncoderContext$u20$as$u20$core..ops..drop..Drop$GT$4drop17h21552780bd20f2c6E+0x5): undefined reference to `LZ4F_freeCompressionContext'
          /usr/bin/ld: /home/et/yay/lolcate/src/lolcate-rs-0.5.0/target/release/deps/liblz4-d46eeb2fcfb05ad1.rlib(lz4-d46eeb2fcfb05ad1.lz4.j6jq8md5-cgu.6.rcgu.o): in function `lz4::decoder::DecoderContext::new':
          lz4.j6jq8md5-cgu.6:(.text._ZN3lz47decoder14DecoderContext3new17h4088ecc508565fabE+0x1a): undefined reference to `LZ4F_createDecompressionContext'
          /usr/bin/ld: /home/et/yay/lolcate/src/lolcate-rs-0.5.0/target/release/deps/liblz4-d46eeb2fcfb05ad1.rlib(lz4-d46eeb2fcfb05ad1.lz4.j6jq8md5-cgu.6.rcgu.o): in function `<lz4::decoder::DecoderContext as core::ops::drop::Drop>::drop':
          lz4.j6jq8md5-cgu.6:(.text._ZN70_$LT$lz4..decoder..DecoderContext$u20$as$u20$core..ops..drop..Drop$GT$4drop17h8e0f5acce9be0bf6E+0x5): undefined reference to `LZ4F_freeDecompressionContext'
          collect2: error: ld returned 1 exit status

Build failed due to undefined reference to `LZ4F_compressBound'.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.