blob: 21e251d92a549dfd1517f319d05e366915b6f2c2 [file] [view]
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# Building C++ Client
## Compile and Test:
### Compile
#### Unix
To compile the cpp client, use the following command:
`mvn clean package -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests`
#### Windows
To compile on Windows, please install Boost first and add following Maven
settings:
```
-Dboost.include.dir=${your boost header folder} -Dboost.library.dir=${your boost lib (stage) folder}`
```
The thrift dependency that the cpp client uses is incompatible with MinGW, please use Visual
Studio. It is highly recommended to use Visual Studio 2022 or later.
##### Visual Studio 2022
If you are using Visual Studio 2022, you can compile the cpp client with the following command:
```
mvn clean package -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests
-D"boost.include.dir"="D:\boost_1_75_0" -D"boost.library.dir"="D:\boost_1_75_0\stage\lib"
```
##### Visual Studio 2019
If you are using Visual Studio 2019, you can compile the cpp client with the following command:
```
mvn clean package -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests
-D"boost.include.dir"="D:\boost_1_75_0" -D"boost.library.dir"="D:\boost_1_75_0\stage\lib"
-Diotdb-tools-thrift.version=0.14.1.1-msvc142-SNAPSHOT -Dcmake.generator="Visual Studio 16 2019"
```
#### Visual Studio 2017 or older
If you are using Visual Studio 2017 or older, the pre-built Thrift library is incompatible. You
will have to compile the thrift library manually:
1. Install the dependencies of Thrift:
* flex http://gnuwin32.sourceforge.net/packages/flex.htm
* bison http://gnuwin32.sourceforge.net/packages/bison.htm
* openssl https://slproweb.com/products/Win32OpenSSL.html
2. Clone the repository: https://github.com/apache/iotdb-bin-resources.
3. Enter the "iotdb-tools-thrift" folder in the cloned repository; use the following command to
compile the thrift library:
`mvn install`
4. If you encounter a problem like "cannot find 'unistd.h'", please open the file
"iotdb-bin-resources\iotdb-tools-thrift\target\build\compiler\cpp\thrift\thriftl.cc" and replace
"#include <unistd.h>" with "#include <io.h>" and "#include <process.h>"; then, rerun the command
in the third step;
5. Return to the cpp client repository and compile it with:
```
mvn clean package -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests
-D"boost.include.dir"="D:\boost_1_75_0" -D"boost.library.dir"="D:\boost_1_75_0\stage\lib"
```
### Test
First build IoTDB server together with the cpp client.
Explicitly using "install" instead of package in order to be sure we're using libs built on this
machine.
`mvn clean install -P with-cpp -pl distribution,iotdb-client/client-cpp -am -DskipTests`
After run verify
`mvn clean verify -P with-cpp -pl iotdb-client/client-cpp -am`
## Code Formatting
We use `clang-format` as the only formatter for C++ code and trigger it through Maven Spotless.
### Required version
The version is pinned in the root `pom.xml` as property `clang.format.version` (same approach as Apache TsFile). Use **clang-format 17.0.6** locally so Spotless agrees with CI.
**JDK for Maven:** the C++ `clangFormat` step is registered only when running Maven on **JDK 11 or newer** (see the `spotless-cpp` profile in this module and in `client-cpp-example`). The repository root still supports JDK 8 for Java builds, but `spotless:check` / `spotless:apply` for C++ will not apply the clang-format rules if you use JDK 8.
### Install clang-format 17.0.6
- Linux (Ubuntu): On **24.04+**, `sudo apt-get install -y clang-format-17`. On **22.04**, that package is not in the default archive; add the LLVM 17 repo with [apt.llvm.org](https://apt.llvm.org/) (e.g. `sudo ./llvm.sh 17`, as CI does). The script installs `clang-17` and related tools but **not** the `clang-format-17` package, so also run `sudo apt-get install -y clang-format-17`. Then point the default `clang-format` at 17.x (Spotless invokes `clang-format` on `PATH`; some releases default to another major version):
`sudo update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-17 100`
`sudo update-alternatives --set clang-format /usr/bin/clang-format-17`
- macOS: `brew install llvm@17`, then e.g. `ln -sf "$(brew --prefix llvm@17)/bin/clang-format" "$(brew --prefix)/bin/clang-format"` and/or put `$(brew --prefix llvm@17)/bin` on your `PATH`.
- Windows: `choco install llvm --version=17.0.6 --force -y` (CI uses `--force` like TsFile so the expected LLVM is selected).
### Validate only (no changes)
`./mvnw -P with-cpp -pl iotdb-client/client-cpp spotless:check`
`./mvnw -P with-cpp -pl example/client-cpp-example spotless:check`
### Auto-fix formatting
`./mvnw -P with-cpp -pl iotdb-client/client-cpp spotless:apply`
`./mvnw -P with-cpp -pl example/client-cpp-example spotless:apply`
### Windows (PowerShell)
PowerShell may treat a comma in `-pl` as an argument separator. Prefer the two commands above. If you need a single invocation, quote the whole `-pl` value, for example:
`./mvnw -P with-cpp "-pl=iotdb-client/client-cpp,example/client-cpp-example" spotless:check`
## Package Hierarchy
If the compilation finishes successfully, the packaged zip file will be placed under
"client-cpp/target/client-cpp-${project.version}-cpp-${os}.zip".
On macOS, the hierarchy of the package should look like this:
```
.
+-- client
| +-- include
| +-- Session.h
| +-- IClientRPCService.h
| +-- client_types.h
| +-- common_types.h
| +-- thrift
| +-- thrift_headers...
| +-- lib
| +-- Release
| +-- libiotdb_session.dylib
| +-- parser.dylib
| +-- thriftmd.dylib
| +-- tutorialgencpp.dylib
```
## Using C++ Client:
```
1. Put the zip file "client-cpp-${project.version}-cpp-${os}.zip" wherever you want;
2. Unzip the archive using the following command, and then you can get the two directories
mentioned above, the header file and the dynamic library:
unzip client-cpp-${project.version}-cpp-${os}.zip
3. Write C++ code to call the operation interface of the cpp client to operate IoTDB,
for detail interface information, please refer to the link: https://iotdb.apache.org/UserGuide/latest/API/Programming-Cpp-Native-API.html
E.g:
#include "include/Session.h"
#include <memory>
#include <iostream>
int main() {
std::cout << "open session" << std::endl;
std::shared_ptr<Session> session(new Session("127.0.0.1", 6667, "root", "root"));
session->open(false);
std::cout << "setStorageGroup: root.test01" << std::endl;
session->setStorageGroup("root.test01");
if (!session->checkTimeseriesExists("root.test01.d0.s0")) {
session->createTimeseries("root.test01.d0.s0", TSDataType::INT64, TSEncoding::RLE, CompressionType::SNAPPY);
std::cout << "create Timeseries: root.test01.d0.s0" << std::endl;
}
std::cout << "session close" << std::endl;
session->close();
}
4. Compile and execute
clang++ -O2 user-cpp-code.cpp -liotdb_session -L/user-unzip-absolute-path/lib -Wl,-rpath /user-unzip-absolute-path/lib -std=c++11
./a.out
```