2019-05-22 20:15:35 +00:00
|
|
|
Folly: Facebook Open-source Library
|
|
|
|
-----------------------------------
|
|
|
|
|
|
|
|
[![Build Status](https://travis-ci.org/facebook/folly.svg?branch=master)](https://travis-ci.org/facebook/folly)
|
|
|
|
|
|
|
|
### What is `folly`?
|
|
|
|
|
|
|
|
Folly (acronymed loosely after Facebook Open Source Library) is a
|
|
|
|
library of C++14 components designed with practicality and efficiency
|
|
|
|
in mind. **Folly contains a variety of core library components used extensively
|
|
|
|
at Facebook**. In particular, it's often a dependency of Facebook's other
|
|
|
|
open source C++ efforts and place where those projects can share code.
|
|
|
|
|
|
|
|
It complements (as opposed to competing against) offerings
|
|
|
|
such as Boost and of course `std`. In fact, we embark on defining our
|
|
|
|
own component only when something we need is either not available, or
|
|
|
|
does not meet the needed performance profile. We endeavor to remove
|
|
|
|
things from folly if or when `std` or Boost obsoletes them.
|
|
|
|
|
|
|
|
Performance concerns permeate much of Folly, sometimes leading to
|
|
|
|
designs that are more idiosyncratic than they would otherwise be (see
|
|
|
|
e.g. `PackedSyncPtr.h`, `SmallLocks.h`). Good performance at large
|
|
|
|
scale is a unifying theme in all of Folly.
|
|
|
|
|
|
|
|
### Logical Design
|
|
|
|
|
|
|
|
Folly is a collection of relatively independent components, some as
|
|
|
|
simple as a few symbols. There is no restriction on internal
|
|
|
|
dependencies, meaning that a given folly module may use any other
|
|
|
|
folly components.
|
|
|
|
|
|
|
|
All symbols are defined in the top-level namespace `folly`, except of
|
|
|
|
course macros. Macro names are ALL_UPPERCASE and should be prefixed
|
|
|
|
with `FOLLY_`. Namespace `folly` defines other internal namespaces
|
|
|
|
such as `internal` or `detail`. User code should not depend on symbols
|
|
|
|
in those namespaces.
|
|
|
|
|
|
|
|
Folly has an `experimental` directory as well. This designation connotes
|
|
|
|
primarily that we feel the API may change heavily over time. This code,
|
|
|
|
typically, is still in heavy use and is well tested.
|
|
|
|
|
|
|
|
### Physical Design
|
|
|
|
|
|
|
|
At the top level Folly uses the classic "stuttering" scheme
|
|
|
|
`folly/folly` used by Boost and others. The first directory serves as
|
|
|
|
an installation root of the library (with possible versioning a la
|
|
|
|
`folly-1.0/`), and the second is to distinguish the library when
|
|
|
|
including files, e.g. `#include <folly/FBString.h>`.
|
|
|
|
|
|
|
|
The directory structure is flat (mimicking the namespace structure),
|
|
|
|
i.e. we don't have an elaborate directory hierarchy (it is possible
|
|
|
|
this will change in future versions). The subdirectory `experimental`
|
|
|
|
contains files that are used inside folly and possibly at Facebook but
|
|
|
|
not considered stable enough for client use. Your code should not use
|
|
|
|
files in `folly/experimental` lest it may break when you update Folly.
|
|
|
|
|
|
|
|
The `folly/folly/test` subdirectory includes the unittests for all
|
|
|
|
components, usually named `ComponentXyzTest.cpp` for each
|
|
|
|
`ComponentXyz.*`. The `folly/folly/docs` directory contains
|
|
|
|
documentation.
|
|
|
|
|
|
|
|
### What's in it?
|
|
|
|
|
|
|
|
Because of folly's fairly flat structure, the best way to see what's in it
|
|
|
|
is to look at the headers in [top level `folly/` directory](https://github.com/facebook/folly/tree/master/folly). You can also
|
|
|
|
check the [`docs` folder](folly/docs) for documentation, starting with the
|
|
|
|
[overview](folly/docs/Overview.md).
|
|
|
|
|
2020-07-20 16:35:17 +00:00
|
|
|
Folly is published on GitHub at https://github.com/facebook/folly
|
2019-05-22 20:15:35 +00:00
|
|
|
|
|
|
|
### Build Notes
|
|
|
|
|
|
|
|
#### Dependencies
|
|
|
|
|
2020-07-20 16:35:17 +00:00
|
|
|
folly requires gcc 5.1+ and a version of boost compiled with C++14 support.
|
2019-05-22 20:15:35 +00:00
|
|
|
|
|
|
|
googletest is required to build and run folly's tests. You can download
|
|
|
|
it from https://github.com/google/googletest/archive/release-1.8.0.tar.gz
|
|
|
|
The following commands can be used to download and install it:
|
|
|
|
|
|
|
|
```
|
|
|
|
wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz && \
|
|
|
|
tar zxf release-1.8.0.tar.gz && \
|
|
|
|
rm -f release-1.8.0.tar.gz && \
|
|
|
|
cd googletest-release-1.8.0 && \
|
|
|
|
cmake . && \
|
|
|
|
make && \
|
|
|
|
make install
|
|
|
|
```
|
|
|
|
|
|
|
|
#### Finding dependencies in non-default locations
|
|
|
|
|
|
|
|
If you have boost, gtest, or other dependencies installed in a non-default
|
|
|
|
location, you can use the `CMAKE_INCLUDE_PATH` and `CMAKE_LIBRARY_PATH`
|
|
|
|
variables to make CMAKE look also look for header files and libraries in
|
|
|
|
non-standard locations. For example, to also search the directories
|
|
|
|
`/alt/include/path1` and `/alt/include/path2` for header files and the
|
|
|
|
directories `/alt/lib/path1` and `/alt/lib/path2` for libraries, you can invoke
|
|
|
|
`cmake` as follows:
|
|
|
|
|
|
|
|
```
|
|
|
|
cmake \
|
|
|
|
-DCMAKE_INCLUDE_PATH=/alt/include/path1:/alt/include/path2 \
|
|
|
|
-DCMAKE_LIBRARY_PATH=/alt/lib/path1:/alt/lib/path2 ...
|
|
|
|
```
|
|
|
|
|
2020-07-20 16:35:17 +00:00
|
|
|
#### Building tests
|
|
|
|
|
|
|
|
By default, building the tests is disabled as part of the CMake `all` target.
|
|
|
|
To build the tests, specify `-DBUILD_TESTS=ON` to CMake at configure time.
|
|
|
|
|
2019-05-22 20:15:35 +00:00
|
|
|
#### Ubuntu 16.04 LTS
|
|
|
|
|
|
|
|
The following packages are required (feel free to cut and paste the apt-get
|
|
|
|
command below):
|
|
|
|
|
|
|
|
```
|
|
|
|
sudo apt-get install \
|
|
|
|
g++ \
|
|
|
|
cmake \
|
|
|
|
libboost-all-dev \
|
|
|
|
libevent-dev \
|
|
|
|
libdouble-conversion-dev \
|
|
|
|
libgoogle-glog-dev \
|
|
|
|
libgflags-dev \
|
|
|
|
libiberty-dev \
|
|
|
|
liblz4-dev \
|
|
|
|
liblzma-dev \
|
|
|
|
libsnappy-dev \
|
|
|
|
make \
|
|
|
|
zlib1g-dev \
|
|
|
|
binutils-dev \
|
|
|
|
libjemalloc-dev \
|
|
|
|
libssl-dev \
|
2020-07-20 16:35:17 +00:00
|
|
|
pkg-config \
|
|
|
|
libunwind-dev
|
|
|
|
```
|
|
|
|
|
|
|
|
Folly relies on [fmt](https://github.com/fmtlib/fmt) which needs to be installed from source.
|
|
|
|
The following commands will download, compile, and install fmt.
|
|
|
|
|
|
|
|
```
|
|
|
|
git clone https://github.com/fmtlib/fmt.git && cd fmt
|
|
|
|
|
|
|
|
mkdir _build && cd _build
|
|
|
|
cmake ..
|
|
|
|
|
|
|
|
make -j$(nproc)
|
|
|
|
sudo make install
|
2019-05-22 20:15:35 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
If advanced debugging functionality is required, use:
|
|
|
|
|
|
|
|
```
|
|
|
|
sudo apt-get install \
|
|
|
|
libunwind8-dev \
|
|
|
|
libelf-dev \
|
|
|
|
libdwarf-dev
|
|
|
|
```
|
|
|
|
|
2020-07-20 16:35:17 +00:00
|
|
|
In the folly directory (e.g. the checkout root or the archive unpack root), run:
|
2019-05-22 20:15:35 +00:00
|
|
|
```
|
|
|
|
mkdir _build && cd _build
|
|
|
|
cmake ..
|
|
|
|
make -j $(nproc)
|
2020-07-20 16:35:17 +00:00
|
|
|
make install # with either sudo or DESTDIR as necessary
|
2019-05-22 20:15:35 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
#### OS X (Homebrew)
|
|
|
|
|
|
|
|
folly is available as a Formula and releases may be built via `brew install folly`.
|
|
|
|
|
|
|
|
You may also use `folly/build/bootstrap-osx-homebrew.sh` to build against `master`:
|
|
|
|
|
|
|
|
```
|
2020-07-20 16:35:17 +00:00
|
|
|
./folly/build/bootstrap-osx-homebrew.sh
|
2019-05-22 20:15:35 +00:00
|
|
|
```
|
|
|
|
|
2020-07-20 16:35:17 +00:00
|
|
|
This will create a build directory `_build` in the top-level.
|
|
|
|
|
2019-05-22 20:15:35 +00:00
|
|
|
#### OS X (MacPorts)
|
|
|
|
|
|
|
|
Install the required packages from MacPorts:
|
|
|
|
|
|
|
|
```
|
|
|
|
sudo port install \
|
|
|
|
boost \
|
2020-07-20 16:35:17 +00:00
|
|
|
cmake \
|
2019-05-22 20:15:35 +00:00
|
|
|
gflags \
|
|
|
|
git \
|
|
|
|
google-glog \
|
|
|
|
libevent \
|
|
|
|
libtool \
|
|
|
|
lz4 \
|
|
|
|
lzma \
|
2020-07-20 16:35:17 +00:00
|
|
|
openssl \
|
2019-05-22 20:15:35 +00:00
|
|
|
snappy \
|
2020-07-20 16:35:17 +00:00
|
|
|
xz \
|
2019-05-22 20:15:35 +00:00
|
|
|
zlib
|
|
|
|
```
|
|
|
|
|
|
|
|
Download and install double-conversion:
|
|
|
|
|
|
|
|
```
|
|
|
|
git clone https://github.com/google/double-conversion.git
|
|
|
|
cd double-conversion
|
|
|
|
cmake -DBUILD_SHARED_LIBS=ON .
|
|
|
|
make
|
|
|
|
sudo make install
|
|
|
|
```
|
|
|
|
|
|
|
|
Download and install folly with the parameters listed below:
|
|
|
|
|
|
|
|
```
|
|
|
|
git clone https://github.com/facebook/folly.git
|
2020-07-20 16:35:17 +00:00
|
|
|
cd folly
|
|
|
|
mkdir _build
|
|
|
|
cd _build
|
|
|
|
cmake ..
|
2019-05-22 20:15:35 +00:00
|
|
|
make
|
|
|
|
sudo make install
|
|
|
|
```
|
|
|
|
|
|
|
|
#### Windows (Vcpkg)
|
|
|
|
|
|
|
|
folly is available in [Vcpkg](https://github.com/Microsoft/vcpkg#vcpkg) and releases may be built via `vcpkg install folly:x64-windows`.
|
|
|
|
|
|
|
|
You may also use `vcpkg install folly:x64-windows --head` to build against `master`.
|
|
|
|
|
|
|
|
#### Other Linux distributions
|
|
|
|
|
|
|
|
- double-conversion (https://github.com/google/double-conversion)
|
|
|
|
|
|
|
|
Download and build double-conversion.
|
|
|
|
You may need to tell cmake where to find it.
|
|
|
|
|
|
|
|
[double-conversion/] `ln -s src double-conversion`
|
|
|
|
|
|
|
|
[folly/] `mkdir build && cd build`
|
|
|
|
[folly/build/] `cmake "-DCMAKE_INCLUDE_PATH=$DOUBLE_CONVERSION_HOME/include" "-DCMAKE_LIBRARY_PATH=$DOUBLE_CONVERSION_HOME/lib" ..`
|
|
|
|
|
|
|
|
[folly/build/] `make`
|
|
|
|
|
|
|
|
- additional platform specific dependencies:
|
|
|
|
|
|
|
|
Fedora >= 21 64-bit (last tested on Fedora 28 64-bit)
|
|
|
|
- gcc
|
|
|
|
- gcc-c++
|
|
|
|
- cmake
|
|
|
|
- automake
|
|
|
|
- boost-devel
|
|
|
|
- libtool
|
|
|
|
- lz4-devel
|
|
|
|
- lzma-devel
|
|
|
|
- snappy-devel
|
|
|
|
- zlib-devel
|
|
|
|
- glog-devel
|
|
|
|
- gflags-devel
|
|
|
|
- scons
|
|
|
|
- double-conversion-devel
|
|
|
|
- openssl-devel
|
|
|
|
- libevent-devel
|
|
|
|
|
|
|
|
Optional
|
|
|
|
- libdwarf-dev
|
|
|
|
- libelf-dev
|
|
|
|
- libunwind8-dev
|