Skip to content

Latest commit

 

History

History
182 lines (138 loc) · 4.54 KB

BUILDING.md

File metadata and controls

182 lines (138 loc) · 4.54 KB

Setup

Make sure to have cloned the SDK repository and have the submodules appropriately synced (git submodule update --init --recursive).

Building

Set CPM Cache

The C++ core utilizes the CMake Package Manager (CPM) to include depencies. These can be set to a cache directory and can be used for future builds. Periodically the dependencies should be updated. So, in general it is good practice to configure the build environment by setting the CPM cache.

Via npm command

npm run prebuild -- --configure --set-cpm-cache --use-boringssl

Available Options

Note: Section under construction

Via cmake-js

Set the cache directory CXXCBC_CACHE_DIR:

export CXXCBC_CACHE_DIR=$PWD/deps/couchbase-cxx-cache

Remove the cache directory

rm -rf $CXXCBC_CACHE_DIR

Configure the build:

$ npx cmake-js configure \
--runtime node \
--runtime-version $(node --version) \
--CDUSE_STATIC_OPENSSL=OFF \
--CDCPM_DOWNLOAD_ALL=OFF \
--CDCPM_USE_NAMED_CACHE_DIRECTORIES=ON \
--CDCPM_USE_LOCAL_PACKAGES=OFF \
--CDCPM_SOURCE_CACHE=$CXXCBC_CACHE_DIR

Build the client binary

Via npm command

npm run prebuild -- --use-boringssl

Available Options

Note: Section under construction

Via cmake-js

NOTE: If using the compile command, the build will automatically clean and re-execute a build upon a failure. Use the build command to only attempt a single build.

Set the cache directory (if it has not already been set) CXXCBC_CACHE_DIR:

export CXXCBC_CACHE_DIR=$PWD/deps/couchbase-cxx-cache
npx cmake-js compile \
--runtime node \
--runtime-version $(node --version) \
--CDUSE_STATIC_OPENSSL=OFF \
--CDCPM_DOWNLOAD_ALL=OFF \
--CDCPM_USE_NAMED_CACHE_DIRECTORIES=ON \
--CDCPM_USE_LOCAL_PACKAGES=OFF \
--CDCPM_SOURCE_CACHE=$CXXCBC_CACHE_DIR

Autogen

IMPORTANT: Autogen is only needed for maintainers of the library. If not making updates to the core bindings, running the autogen tooling should NOT be required.

Move into the tools directory prior to running any autogen commands.

Python Environment

NOTE: Python >= 3.9 required

Setup virtual env:

python3 -m venv <path to virtualenv>

Example: python3 -m venv $(pwd)/couchnode

Activate virtual env:

source <path to virtualenv>/bin/activate

Example: source $(pwd)/couchnode/bin/activate

Install clang from PyPI:

python3 -m pip install clang

Generate bindings.json. If no arguments are passed in the binding generator will attempt to determine the necessary version, lib directory, include directory and system headers directory.

python3 gen-bindings-json.py

Alternatively, options can be provided (or ENV variables may be set):

python gen-bindings-json.py -v $(llvm-config --version) \
-i $(llvm-config --includedir) \
-l $(llvm-config --libdir) \
-s $(xcrun --show-sdk-path)

Available Environment Variables:

  • CN_LLVM_VERSION: LLVM version
  • CN_LLVM_INCLUDE: LLVM include directory path
  • CN_LLVM_LIB: LLVM lib directory path
  • CN_SYS_HEADERS: System headers path

Node.js

Populate SDK autogen code sections:

node gen-bindings.js.js

clean-up

Format C++ source files.

On MacOS, make sure LLVM clang-format is used (configure the PATH appropriately):

export PATH="/opt/homebrew/opt/llvm/bin:$PATH" 

NOTE: Be aware of the current working directory (commands below assume the CWD is tools).

clang-format -i ../src/connection.cpp
clang-format -i ../src/connection.hpp
clang-format -i ../src/connection_autogen.cpp
clang-format -i ../src/constants.cpp
clang-format -i ../src/jstocbpp_autogen.hpp

Format Node.js source files.

NOTE: Be aware of the current working directory (commands below assume the CWD is tools).

npx prettier --write ../lib/binding.ts

Remove bindings.json

rm bindings.json

Format autogen scripts.

This should rarely be needed (e.g. updating the autogen logic).

NOTE: Be aware of the current working directory (commands below assume the CWD is tools).

Python

Install autopep8 from PyPI:

python3 -m pip install autopep8
autopep8 -i -a -a --max-line-length 120 gen-bindings-json.py

Node.js

npx prettier --write gen-bindings-js.js

If a virtualenv was setup (hopefully it was ;)), deactivate and the environment

deactivate
rm -rf <path to virtualenv>

Example: deactivate && rm -rf $(pwd)/couchnode