什么是Folly?

it2022-05-21  68

Folly: Facebook Open-source Library-----------------------------------

### What is `folly`?

Folly (acronymed loosely after Facebook Open Source Library) is alibrary of C++11 components designed with practicality and efficiencyin mind. **Folly contains a variety of core library components used extensivelyat Facebook**. In particular, it's often a dependency of Facebook's otheropen source C++ efforts and place where those projects can share code.

It complements (as opposed to competing against) offeringssuch as Boost and of course `std`. In fact, we embark on defining ourown component only when something we need is either not available, ordoes not meet the needed performance profile. We endeavor to removethings from folly if or when `std` or Boost obsoletes them.

Performance concerns permeate much of Folly, sometimes leading todesigns that are more idiosyncratic than they would otherwise be (seee.g. `PackedSyncPtr.h`, `SmallLocks.h`). Good performance at largescale is a unifying theme in all of Folly.

### Logical Design

Folly is a collection of relatively independent components, some assimple as a few symbols. There is no restriction on internaldependencies, meaning that a given folly module may use any otherfolly components.

All symbols are defined in the top-level namespace `folly`, except ofcourse macros. Macro names are ALL_UPPERCASE and should be prefixedwith `FOLLY_`. Namespace `folly` defines other internal namespacessuch as `internal` or `detail`. User code should not depend on symbolsin those namespaces.

Folly has an `experimental` directory as well. This designation connotesprimarily 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 asan installation root of the library (with possible versioning a la`folly-1.0/`), and the second is to distinguish the library whenincluding 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 possiblethis will change in future versions). The subdirectory `experimental`contains files that are used inside folly and possibly at Facebook butnot considered stable enough for client use. Your code should not usefiles in `folly/experimental` lest it may break when you update Folly.

The `folly/folly/test` subdirectory includes the unittests for allcomponents, usually named `ComponentXyzTest.cpp` for each`ComponentXyz.*`. The `folly/folly/docs` directory containsdocumentation.

### What's in it?

Because of folly's fairly flat structure, the best way to see what's in itis to look at the headers in [top level `folly/` directory](https://github.com/facebook/folly/tree/master/folly). You can alsocheck the [`docs` folder](folly/docs) for documentation, starting with the[overview](folly/docs/Overview.md).

Folly is published on Github at https://github.com/facebook/folly

### Build Notes

#### Dependencies

folly requires gcc 4.9+ and a version of boost compiled with C++14 support.

Please download googletest fromhttps://github.com/google/googletest/archive/release-1.8.0.tar.gz and unpack it into thefolly/test subdirectory as `gtest`:

(cd folly/test && \ rm -rf gtest && \ 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 && \ mv googletest-release-1.8.0 gtest)

#### Ubuntu 12.04

This release is old, requiring many upgrades. However, since Travis CI runson 12.04, `folly/build/deps_ubuntu_12.04.sh` is provided, and upgrades allthe required packages.

#### Ubuntu 13.10

The following packages are required (feel free to cut and paste the apt-getcommand below):

```sudo apt-get install \ g++ \ automake \ autoconf \ autoconf-archive \ libtool \ libboost-all-dev \ libevent-dev \ libdouble-conversion-dev \ libgoogle-glog-dev \ libgflags-dev \ liblz4-dev \ liblzma-dev \ libsnappy-dev \ make \ zlib1g-dev \ binutils-dev \ libjemalloc-dev \ libssl-dev \ pkg-config```

If advanced debugging functionality is required

```sudo apt-get install \ libunwind8-dev \ libelf-dev \ libdwarf-dev```

#### Ubuntu 14.04 LTS

The packages listed above for Ubuntu 13.10 are required, as well as:

```sudo apt-get install \ libiberty-dev```

The above packages are sufficient for Ubuntu 13.10 and Ubuntu 14.04.

In the folly directory, run``` autoreconf -ivf ./configure make make check sudo make install```

#### 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`:

``` cd folly ./build/bootstrap-osx-homebrew.sh```

#### OS X (MacPorts)

Install the required packages from MacPorts:

``` sudo port install \ autoconf \ automake \ boost \ gflags \ git \ google-glog \ libevent \ libtool \ lz4 \ lzma \ scons \ snappy \ 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 cd folly/folly autoreconf -ivf ./configure CPPFLAGS="-I/opt/local/include" LDFLAGS="-L/opt/local/lib" make sudo make install```

#### Other Linux distributions

- double-conversion (https://github.com/google/double-conversion)

Download and build double-conversion. You may need to tell configure where to find it.

[double-conversion/] `ln -s src double-conversion`

[folly/] `./configure LDFLAGS=-L$DOUBLE_CONVERSION_HOME/ CPPFLAGS=-I$DOUBLE_CONVERSION_HOME/`

[folly/] `LD_LIBRARY_PATH=$DOUBLE_CONVERSION_HOME/ make`

- additional platform specific dependencies:

Fedora 21 64-bit - gcc - gcc-c++ - autoconf - autoconf-archive - 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

转载于:https://www.cnblogs.com/svenzhang9527/p/7067898.html


最新回复(0)