diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index 7ece9710a8..e32d8934ba 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -6,29 +6,17 @@ inputs: runs: using: composite steps: - - name: export custom recipes - shell: bash - run: | - conan export --version 1.1.10 external/snappy - conan export --version 4.0.3 external/soci - - name: add Ripple Conan remote + - name: add Conan remote if: env.CONAN_URL != '' shell: bash run: | - if conan remote list | grep -q "ripple"; then - conan remote remove ripple - echo "Removed conan remote ripple" + if conan remote list | grep -q 'xrplf'; then + conan remote update --index 0 --url ${CONAN_URL} xrplf + echo "Updated Conan remote 'xrplf' to ${CONAN_URL}." + else + conan remote add --index 0 xrplf ${CONAN_URL} + echo "Added new conan remote 'xrplf' at ${CONAN_URL}." fi - conan remote add --index 0 ripple "${CONAN_URL}" - echo "Added conan remote ripple at ${CONAN_URL}" - - name: try to authenticate to Ripple Conan remote - if: env.CONAN_LOGIN_USERNAME_RIPPLE != '' && env.CONAN_PASSWORD_RIPPLE != '' - id: remote - shell: bash - run: | - echo "Authenticating to ripple remote..." - conan remote auth ripple --force - conan remote list-users - name: list missing binaries id: binaries shell: bash diff --git a/.github/workflows/libxrpl.yml b/.github/workflows/libxrpl.yml index 79cd872210..a8746fe297 100644 --- a/.github/workflows/libxrpl.yml +++ b/.github/workflows/libxrpl.yml @@ -1,8 +1,8 @@ name: Check libXRPL compatibility with Clio env: - CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/dev - CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }} - CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }} + CONAN_URL: https://conan.ripplex.io + CONAN_LOGIN_USERNAME_XRPLF: ${{ secrets.CONAN_USERNAME }} + CONAN_PASSWORD_XRPLF: ${{ secrets.CONAN_TOKEN }} on: pull_request: paths: @@ -43,20 +43,20 @@ jobs: shell: bash run: | conan export . ${{ steps.channel.outputs.channel }} - - name: Add Ripple Conan remote + - name: Add Conan remote shell: bash run: | conan remote list - conan remote remove ripple || true + conan remote remove xrplf || true # Do not quote the URL. An empty string will be accepted (with a non-fatal warning), but a missing argument will not. - conan remote add ripple ${{ env.CONAN_URL }} --insert 0 + conan remote add xrplf ${{ env.CONAN_URL }} --insert 0 - name: Parse new version id: version shell: bash run: | echo version="$(cat src/libxrpl/protocol/BuildInfo.cpp | grep "versionString =" \ | awk -F '"' '{print $2}')" | tee ${GITHUB_OUTPUT} - - name: Try to authenticate to Ripple Conan remote + - name: Try to authenticate to Conan remote id: remote shell: bash run: | @@ -64,7 +64,7 @@ jobs: # https://docs.conan.io/1/reference/commands/misc/user.html#using-environment-variables # https://docs.conan.io/1/reference/env_vars.html#conan-login-username-conan-login-username-remote-name # https://docs.conan.io/1/reference/env_vars.html#conan-password-conan-password-remote-name - echo outcome=$(conan user --remote ripple --password >&2 \ + echo outcome=$(conan user --remote xrplf --password >&2 \ && echo success || echo failure) | tee ${GITHUB_OUTPUT} - name: Upload new package id: upload diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index adea15af9e..c056468fc6 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -18,9 +18,7 @@ concurrency: # This part of Conan configuration is specific to this workflow only; we do not want # to pollute conan/profiles directory with settings which might not work for others env: - CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/dev - CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }} - CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }} + CONAN_URL: https://conan.ripplex.io CONAN_GLOBAL_CONF: | core.download:parallel={{os.cpu_count()}} core.upload:parallel={{os.cpu_count()}} @@ -87,24 +85,9 @@ jobs: clang --version - name: configure Conan run : | - echo "${CONAN_GLOBAL_CONF}" >> $(conan config home)/global.conf + echo "${CONAN_GLOBAL_CONF}" > $(conan config home)/global.conf conan config install conan/profiles/ -tf $(conan config home)/profiles/ conan profile show - - name: export custom recipes - shell: bash - run: | - conan export --version 1.1.10 external/snappy - conan export --version 4.0.3 external/soci - - name: add Ripple Conan remote - if: env.CONAN_URL != '' - shell: bash - run: | - if conan remote list | grep -q "ripple"; then - conan remote remove ripple - echo "Removed conan remote ripple" - fi - conan remote add --index 0 ripple "${CONAN_URL}" - echo "Added conan remote ripple at ${CONAN_URL}" - name: build dependencies uses: ./.github/actions/dependencies with: diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index d6490e4caa..14e98e3fb0 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -19,9 +19,7 @@ concurrency: # This part of Conan configuration is specific to this workflow only; we do not want # to pollute conan/profiles directory with settings which might not work for others env: - CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/dev - CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }} - CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }} + CONAN_URL: https://conan.ripplex.io CONAN_GLOBAL_CONF: | core.download:parallel={{ os.cpu_count() }} core.upload:parallel={{ os.cpu_count() }} diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 84a91bcb4e..4de92c8049 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -21,9 +21,7 @@ concurrency: # This part of Conan configuration is specific to this workflow only; we do not want # to pollute conan/profiles directory with settings which might not work for others env: - CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/dev - CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }} - CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }} + CONAN_URL: https://conan.ripplex.io CONAN_GLOBAL_CONF: | core.download:parallel={{os.cpu_count()}} core.upload:parallel={{os.cpu_count()}} @@ -82,24 +80,9 @@ jobs: - name: configure Conan shell: bash run: | - echo "${CONAN_GLOBAL_CONF}" >> $(conan config home)/global.conf + echo "${CONAN_GLOBAL_CONF}" > $(conan config home)/global.conf conan config install conan/profiles/ -tf $(conan config home)/profiles/ conan profile show - - name: export custom recipes - shell: bash - run: | - conan export --version 1.1.10 external/snappy - conan export --version 4.0.3 external/soci - - name: add Ripple Conan remote - if: env.CONAN_URL != '' - shell: bash - run: | - if conan remote list | grep -q "ripple"; then - conan remote remove ripple - echo "Removed conan remote ripple" - fi - conan remote add --index 0 ripple "${CONAN_URL}" - echo "Added conan remote ripple at ${CONAN_URL}" - name: build dependencies uses: ./.github/actions/dependencies with: diff --git a/BUILD.md b/BUILD.md index 072e38af93..e1567e297c 100644 --- a/BUILD.md +++ b/BUILD.md @@ -3,29 +3,29 @@ | These instructions assume you have a C++ development environment ready with Git, Python, Conan, CMake, and a C++ compiler. For help setting one up on Linux, macOS, or Windows, [see this guide](./docs/build/environment.md). | > These instructions also assume a basic familiarity with Conan and CMake. -> If you are unfamiliar with Conan, -> you can read our [crash course](./docs/build/conan.md) -> or the official [Getting Started][3] walkthrough. +> If you are unfamiliar with Conan, you can read our +> [crash course](./docs/build/conan.md) or the official [Getting Started][3] +> walkthrough. ## Branches For a stable release, choose the `master` branch or one of the [tagged releases](https://github.com/ripple/rippled/releases). -``` +```bash git checkout master ``` For the latest release candidate, choose the `release` branch. -``` +```bash git checkout release ``` For the latest set of untested features, or to contribute, choose the `develop` branch. -``` +```bash git checkout develop ``` @@ -33,151 +33,295 @@ git checkout develop See [System Requirements](https://xrpl.org/system-requirements.html). -Building rippled generally requires git, Python, Conan, CMake, and a C++ compiler. Some guidance on setting up such a [C++ development environment can be found here](./docs/build/environment.md). +Building rippled generally requires git, Python, Conan, CMake, and a C++ +compiler. Some guidance on setting up such a [C++ development environment can be +found here](./docs/build/environment.md). -- [Python 3.7](https://www.python.org/downloads/) -- [Conan 1.60](https://conan.io/downloads.html)[^1] -- [CMake 3.16](https://cmake.org/download/) +- [Python 3.11](https://www.python.org/downloads/), or higher +- [Conan 2.17](https://conan.io/downloads.html)[^1], or higher +- [CMake 3.22](https://cmake.org/download/)[^2], or higher -[^1]: It is possible to build with Conan 2.x, -but the instructions are significantly different, -which is why we are not recommending it yet. -Notably, the `conan profile update` command is removed in 2.x. -Profiles must be edited by hand. +[^1]: It is possible to build with Conan 1.60+, but the instructions are +significantly different, which is why we are not recommending it. + +[^2]: CMake 4 is not yet supported by all dependencies required by this project. +If you are affected by this issue, follow [conan workaround for cmake +4](#workaround-for-cmake-4) `rippled` is written in the C++20 dialect and includes the `` header. The [minimum compiler versions][2] required are: | Compiler | Version | -|-------------|---------| -| GCC | 11 | -| Clang | 13 | -| Apple Clang | 13.1.6 | -| MSVC | 19.23 | +|-------------|-----| +| GCC | 12 | +| Clang | 16 | +| Apple Clang | 16 | +| MSVC | 19.44[^3] | ### Linux -The Ubuntu operating system has received the highest level of -quality assurance, testing, and support. +The Ubuntu Linux distribution has received the highest level of quality +assurance, testing, and support. We also support Red Hat and use Debian +internally. -Here are [sample instructions for setting up a C++ development environment on Linux](./docs/build/environment.md#linux). +Here are [sample instructions for setting up a C++ development environment on +Linux](./docs/build/environment.md#linux). ### Mac Many rippled engineers use macOS for development. -Here are [sample instructions for setting up a C++ development environment on macOS](./docs/build/environment.md#macos). +Here are [sample instructions for setting up a C++ development environment on +macOS](./docs/build/environment.md#macos). ### Windows -Windows is not recommended for production use at this time. +Windows is used by some engineers for development only. -- Additionally, 32-bit Windows development is not supported. - -[Boost]: https://www.boost.org/ +[^3]: Windows is not recommended for production use. ## Steps ### Set Up Conan -After you have a [C++ development environment](./docs/build/environment.md) ready with Git, Python, Conan, CMake, and a C++ compiler, you may need to set up your Conan profile. +After you have a [C++ development environment](./docs/build/environment.md) ready with Git, Python, +Conan, CMake, and a C++ compiler, you may need to set up your Conan profile. -These instructions assume a basic familiarity with Conan and CMake. +These instructions assume a basic familiarity with Conan and CMake. If you are +unfamiliar with Conan, then please read [this crash course](./docs/build/conan.md) or the official +[Getting Started][3] walkthrough. -If you are unfamiliar with Conan, then please read [this crash course](./docs/build/conan.md) or the official [Getting Started][3] walkthrough. +#### Default profile +We recommend that you import the provided `conan/profiles/default` profile: -You'll need at least one Conan profile: - - ``` - conan profile new default --detect - ``` - -Update the compiler settings: - - ``` - conan profile update settings.compiler.cppstd=20 default - ``` - -Configure Conan (1.x only) to use recipe revisions: - - ``` - conan config set general.revisions_enabled=1 - ``` - -**Linux** developers will commonly have a default Conan [profile][] that compiles -with GCC and links with libstdc++. -If you are linking with libstdc++ (see profile setting `compiler.libcxx`), -then you will need to choose the `libstdc++11` ABI: - - ``` - conan profile update settings.compiler.libcxx=libstdc++11 default - ``` - - -Ensure inter-operability between `boost::string_view` and `std::string_view` types: - -``` -conan profile update 'conf.tools.build:cxxflags+=["-DBOOST_BEAST_USE_STD_STRING_VIEW"]' default -conan profile update 'env.CXXFLAGS="-DBOOST_BEAST_USE_STD_STRING_VIEW"' default +```bash +conan config install conan/profiles/ -tf $(conan config home)/profiles/ ``` -If you have other flags in the `conf.tools.build` or `env.CXXFLAGS` sections, make sure to retain the existing flags and append the new ones. You can check them with: -``` -conan profile show default +You can check your Conan profile by running: + +```bash +conan profile show ``` +#### Custom profile -**Windows** developers may need to use the x64 native build tools. -An easy way to do that is to run the shortcut "x64 Native Tools Command -Prompt" for the version of Visual Studio that you have installed. +If the default profile does not work for you and you do not yet have a Conan +profile, you can create one by running: - Windows developers must also build `rippled` and its dependencies for the x64 - architecture: - - ``` - conan profile update settings.arch=x86_64 default - ``` - -### Multiple compilers - -When `/usr/bin/g++` exists on a platform, it is the default cpp compiler. This -default works for some users. - -However, if this compiler cannot build rippled or its dependencies, then you can -install another compiler and set Conan and CMake to use it. -Update the `conf.tools.build:compiler_executables` setting in order to set the correct variables (`CMAKE__COMPILER`) in the -generated CMake toolchain file. -For example, on Ubuntu 20, you may have gcc at `/usr/bin/gcc` and g++ at `/usr/bin/g++`; if that is the case, you can select those compilers with: -``` -conan profile update 'conf.tools.build:compiler_executables={"c": "/usr/bin/gcc", "cpp": "/usr/bin/g++"}' default +```bash +conan profile detect ``` -Replace `/usr/bin/gcc` and `/usr/bin/g++` with paths to the desired compilers. +You may need to make changes to the profile to suit your environment. You can +refer to the provided `conan/profiles/default` profile for inspiration, and you +may also need to apply the required [tweaks](#conan-profile-tweaks) to this +default profile. -It should choose the compiler for dependencies as well, -but not all of them have a Conan recipe that respects this setting (yet). -For the rest, you can set these environment variables. -Replace `` with paths to the desired compilers: +### Patched recipes -- `conan profile update env.CC= default` -- `conan profile update env.CXX= default` +The recipes in Conan Center occasionally need to be patched for compatibility +with the latest version of `rippled`. We maintain a fork of the Conan Center +[here](https://github.com/XRPLF/conan-center-index/) containing the patches. -Export our [Conan recipe for Snappy](./external/snappy). -It does not explicitly link the C++ standard library, -which allows you to statically link it with GCC, if you want. +To ensure our patched recipes are used, you must add our Conan remote at a +higher index than the default Conan Center remote, so it is consulted first. You +can do this by running: - ``` - # Conan 2.x - conan export --version 1.1.10 external/snappy +```bash +conan remote add --index 0 xrplf "https://conan.ripplex.io" +``` + +Alternatively, you can pull the patched recipes into the repository and use them +locally: + +```bash +cd external +git init +git remote add origin git@github.com:XRPLF/conan-center-index.git +git sparse-checkout init +git sparse-checkout set recipes/snappy +git sparse-checkout add recipes/soci +git fetch origin master +git checkout master +conan export --version 1.1.10 external/recipes/snappy +conan export --version 4.0.3 external/recipes/soci +``` + +In the case we switch to a newer version of a dependency that still requires a +patch, it will be necessary for you to pull in the changes and re-export the +updated dependencies with the newer version. However, if we switch to a newer +version that no longer requires a patch, no action is required on your part, as +the new recipe will be automatically pulled from the official Conan Center. + +### Conan profile tweaks + +#### Missing compiler version + +If you see an error similar to the following after running `conan profile show`: + +```bash +ERROR: Invalid setting '17' is not a valid 'settings.compiler.version' value. +Possible values are ['5.0', '5.1', '6.0', '6.1', '7.0', '7.3', '8.0', '8.1', +'9.0', '9.1', '10.0', '11.0', '12.0', '13', '13.0', '13.1', '14', '14.0', '15', +'15.0', '16', '16.0'] +Read "http://docs.conan.io/2/knowledge/faq.html#error-invalid-setting" +``` + +you need to amend the list of compiler versions in +`$(conan config home)/settings.yml`, by appending the required version number(s) +to the `version` array specific for your compiler. For example: + +```yaml + apple-clang: + version: ["5.0", "5.1", "6.0", "6.1", "7.0", "7.3", "8.0", "8.1", "9.0", + "9.1", "10.0", "11.0", "12.0", "13", "13.0", "13.1", "14", + "14.0", "15", "15.0", "16", "16.0", "17", "17.0"] +``` + +#### Multiple compilers + +If you have multiple compilers installed, make sure to select the one to use in +your default Conan configuration **before** running `conan profile detect`, by +setting the `CC` and `CXX` environment variables. + +For example, if you are running MacOS and have [homebrew +LLVM@18](https://formulae.brew.sh/formula/llvm@18), and want to use it as a +compiler in the new Conan profile: + + ```bash + export CC=$(brew --prefix llvm@18)/bin/clang + export CXX=$(brew --prefix llvm@18)/bin/clang++ + conan profile detect ``` -Export our [Conan recipe for SOCI](./external/soci). -It patches their CMake to correctly import its dependencies. +You should also explicitly set the path to the compiler in the profile file, +which helps to avoid errors when `CC` and/or `CXX` are set and disagree with the +selected Conan profile. For example: - ``` - # Conan 2.x - conan export --version 4.0.3 external/soci - ``` +```text +[conf] +tools.build:compiler_executables={'c':'/usr/bin/gcc','cpp':'/usr/bin/g++'} +``` + +#### Multiple profiles + +You can manage multiple Conan profiles in the directory +`$(conan config home)/profiles`, for example renaming `default` to a different +name and then creating a new `default` profile for a different compiler. + +#### Select language + +The default profile created by Conan will typically select different C++ dialect +than C++20 used by this project. You should set `20` in the profile line +starting with `compiler.cppstd=`. For example: + +```bash +sed -i.bak -e 's|^compiler\.cppstd=.*$|compiler.cppstd=20|' $(conan config home)/profiles/default +``` + +#### Select standard library in Linux + +**Linux** developers will commonly have a default Conan [profile][] that +compiles with GCC and links with libstdc++. If you are linking with libstdc++ +(see profile setting `compiler.libcxx`), then you will need to choose the +`libstdc++11` ABI: + +```bash +sed -i.bak -e 's|^compiler\.libcxx=.*$|compiler.libcxx=libstdc++11|' $(conan config home)/profiles/default +``` + +#### Select architecture and runtime in Windows + +**Windows** developers may need to use the x64 native build tools. An easy way +to do that is to run the shortcut "x64 Native Tools Command Prompt" for the +version of Visual Studio that you have installed. + +Windows developers must also build `rippled` and its dependencies for the x64 +architecture: + +```bash +sed -i.bak -e 's|^arch=.*$|arch=x86_64|' $(conan config home)/profiles/default +``` + +**Windows** developers also must select static runtime: + +```bash +sed -i.bak -e 's|^compiler\.runtime=.*$|compiler.runtime=static|' $(conan config home)/profiles/default +``` + +#### Workaround for CMake 4 + +If your system CMake is version 4 rather than 3, you may have to configure Conan +profile to use CMake version 3 for dependencies, by adding the following two +lines to your profile: + +```text +[tool_requires] +!cmake/*: cmake/[>=3 <4] +``` + +This will force Conan to download and use a locally cached CMake 3 version, and +is needed because some of the dependencies used by this project do not support +CMake 4. + +#### Clang workaround for grpc + +If your compiler is clang, version 19 or later, or apple-clang, version 17 or +later, you may encounter a compilation error while building the `grpc` +dependency: + +```text +In file included from .../lib/promise/try_seq.h:26: +.../lib/promise/detail/basic_seq.h:499:38: error: a template argument list is expected after a name prefixed by the template keyword [-Wmissing-template-arg-list-after-template-kw] + 499 | Traits::template CallSeqFactory(f_, *cur_, std::move(arg))); + | ^ +``` + +The workaround for this error is to add two lines to profile: + +```text +[conf] +tools.build:cxxflags=['-Wno-missing-template-arg-list-after-template-kw'] +``` + +#### Workaround for gcc 12 + +If your compiler is gcc, version 12, and you have enabled `werr` option, you may +encounter a compilation error such as: + +```text +/usr/include/c++/12/bits/char_traits.h:435:56: error: 'void* __builtin_memcpy(void*, const void*, long unsigned int)' accessing 9223372036854775810 or more bytes at offsets [2, 9223372036854775807] and 1 may overlap up to 9223372036854775813 bytes at offset -3 [-Werror=restrict] + 435 | return static_cast(__builtin_memcpy(__s1, __s2, __n)); + | ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ +cc1plus: all warnings being treated as errors +``` + +The workaround for this error is to add two lines to your profile: + +```text +[conf] +tools.build:cxxflags=['-Wno-restrict'] +``` + +#### Workaround for clang 16 + +If your compiler is clang, version 16, you may encounter compilation error such +as: + +```text +In file included from .../boost/beast/websocket/stream.hpp:2857: +.../boost/beast/websocket/impl/read.hpp:695:17: error: call to 'async_teardown' is ambiguous + async_teardown(impl.role, impl.stream(), + ^~~~~~~~~~~~~~ +``` + +The workaround for this error is to add two lines to your profile: + +```text +[conf] +tools.build:cxxflags=['-DBOOST_ASIO_DISABLE_CONCEPTS'] +``` ### Build and Test @@ -245,7 +389,6 @@ It patches their CMake to correctly import its dependencies. cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -Dxrpld=ON -Dtests=ON .. ``` - Multi-config generators: ``` @@ -257,13 +400,13 @@ It patches their CMake to correctly import its dependencies. 5. Build `rippled`. For a single-configuration generator, it will build whatever configuration - you passed for `CMAKE_BUILD_TYPE`. For a multi-configuration generator, - you must pass the option `--config` to select the build configuration. + you passed for `CMAKE_BUILD_TYPE`. For a multi-configuration generator, you + must pass the option `--config` to select the build configuration. Single-config generators: ``` - cmake --build . -j $(nproc) + cmake --build . ``` Multi-config generators: @@ -278,18 +421,22 @@ It patches their CMake to correctly import its dependencies. Single-config generators: ``` - ./rippled --unittest + ./rippled --unittest --unittest-jobs N ``` Multi-config generators: ``` - ./Release/rippled --unittest - ./Debug/rippled --unittest + ./Release/rippled --unittest --unittest-jobs N + ./Debug/rippled --unittest --unittest-jobs N ``` - The location of `rippled` in your build directory depends on your CMake - generator. Pass `--help` to see the rest of the command line options. + Replace the `--unittest-jobs` parameter N with the desired unit tests + concurrency. Recommended setting is half of the number of available CPU + cores. + + The location of `rippled` binary in your build directory depends on your + CMake generator. Pass `--help` to see the rest of the command line options. ## Coverage report @@ -347,7 +494,7 @@ cmake --build . --target coverage After the `coverage` target is completed, the generated coverage report will be stored inside the build directory, as either of: -- file named `coverage.`_extension_ , with a suitable extension for the report format, or +- file named `coverage.`_extension_, with a suitable extension for the report format, or - directory named `coverage`, with the `index.html` and other files inside, for the `html-details` or `html-nested` report formats. @@ -355,12 +502,14 @@ stored inside the build directory, as either of: | Option | Default Value | Description | | --- | ---| ---| -| `assert` | OFF | Enable assertions. +| `assert` | OFF | Enable assertions. | | `coverage` | OFF | Prepare the coverage report. | | `san` | N/A | Enable a sanitizer with Clang. Choices are `thread` and `address`. | | `tests` | OFF | Build tests. | -| `unity` | ON | Configure a unity build. | +| `unity` | OFF | Configure a unity build. | | `xrpld` | OFF | Build the xrpld (`rippled`) application, and not just the libxrpl library. | +| `werr` | OFF | Treat compilation warnings as errors | +| `wextra` | OFF | Enable additional compilation warnings | [Unity builds][5] may be faster for the first build (at the cost of much more memory) since they concatenate sources into fewer @@ -375,12 +524,28 @@ and can be helpful for detecting `#include` omissions. After any updates or changes to dependencies, you may need to do the following: 1. Remove your build directory. -2. Remove the Conan cache: `conan remove "*" -c` -3. Re-run [conan install](#build-and-test). +2. Remove individual libraries from the Conan cache, e.g. -### 'protobuf/port_def.inc' file not found + ```bash + conan remove 'grpc/*' + ``` -If `cmake --build .` results in an error due to a missing a protobuf file, then you might have generated CMake files for a different `build_type` than the `CMAKE_BUILD_TYPE` you passed to conan. + **or** + + Remove all libraries from Conan cache: + + ```bash + conan remove '*' + ``` + +3. Re-run [conan export](#patched-recipes) if needed. +4. Re-run [conan install](#build-and-test). + +### `protobuf/port_def.inc` file not found + +If `cmake --build .` results in an error due to a missing a protobuf file, then +you might have generated CMake files for a different `build_type` than the +`CMAKE_BUILD_TYPE` you passed to Conan. ``` /rippled/.build/pb-xrpl.libpb/xrpl/proto/ripple.pb.h:10:10: fatal error: 'google/protobuf/port_def.inc' file not found diff --git a/docs/build/environment.md b/docs/build/environment.md index 40a80d4b25..7301879d09 100644 --- a/docs/build/environment.md +++ b/docs/build/environment.md @@ -10,37 +10,35 @@ platforms: Linux, macOS, or Windows. Package ecosystems vary across Linux distributions, so there is no one set of instructions that will work for every Linux user. -These instructions are written for Ubuntu 22.04. -They are largely copied from the [script][1] used to configure our Docker -container for continuous integration. -That script handles many more responsibilities. -These instructions are just the bare minimum to build one configuration of -rippled. -You can check that codebase for other Linux distributions and versions. -If you cannot find yours there, -then we hope that these instructions can at least guide you in the right -direction. +The instructions below are written for Debian 12 (Bookworm). ``` -apt update -apt install --yes curl git libssl-dev pipx python3.10-dev python3-pip make g++-11 libprotobuf-dev protobuf-compiler +export GCC_RELEASE=12 +sudo apt update +sudo apt install --yes gcc-${GCC_RELEASE} g++-${GCC_RELEASE} python3-pip \ + python-is-python3 python3-venv python3-dev curl wget ca-certificates \ + git build-essential cmake ninja-build libc6-dev +sudo pip install --break-system-packages conan -curl --location --remote-name \ - "https://github.com/Kitware/CMake/releases/download/v3.25.1/cmake-3.25.1.tar.gz" -tar -xzf cmake-3.25.1.tar.gz -rm cmake-3.25.1.tar.gz -cd cmake-3.25.1 -./bootstrap --parallel=$(nproc) -make --jobs $(nproc) -make install -cd .. - -pipx install 'conan<2' -pipx ensurepath +sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-${GCC_RELEASE} 999 +sudo update-alternatives --install \ + /usr/bin/gcc gcc /usr/bin/gcc-${GCC_RELEASE} 100 \ + --slave /usr/bin/g++ g++ /usr/bin/g++-${GCC_RELEASE} \ + --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-${GCC_RELEASE} \ + --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-${GCC_RELEASE} \ + --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-${GCC_RELEASE} \ + --slave /usr/bin/gcov gcov /usr/bin/gcov-${GCC_RELEASE} \ + --slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-${GCC_RELEASE} \ + --slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-${GCC_RELEASE} \ + --slave /usr/bin/lto-dump lto-dump /usr/bin/lto-dump-${GCC_RELEASE} +sudo update-alternatives --auto cc +sudo update-alternatives --auto gcc ``` -[1]: https://github.com/thejohnfreeman/rippled-docker/blob/master/ubuntu-22.04/install.sh - +If you use different Linux distribution, hope the instruction above can guide +you in the right direction. We try to maintain compatibility with all recent +compiler releases, so if you use a rolling distribution like e.g. Arch or CentOS +then there is a chance that everything will "just work". ## macOS @@ -100,10 +98,10 @@ and use it to install Conan: brew update brew install xz brew install pyenv -pyenv install 3.10-dev -pyenv global 3.10-dev +pyenv install 3.11 +pyenv global 3.11 eval "$(pyenv init -)" -pip install 'conan<2' +pip install 'conan' ``` Install CMake with Homebrew too: diff --git a/external/README.md b/external/README.md index c810539fd7..a3d04da264 100644 --- a/external/README.md +++ b/external/README.md @@ -1,14 +1,10 @@ # External Conan recipes -The subdirectories in this directory contain either copies or Conan recipes -of external libraries used by rippled. -The Conan recipes include patches we have not yet pushed upstream. +The subdirectories in this directory contain copies of external libraries used +by rippled. | Folder | Upstream | Description | |:----------------|:---------------------------------------------|:------------| | `antithesis-sdk`| [Project](https://github.com/antithesishq/antithesis-sdk-cpp/) | [Antithesis](https://antithesis.com/docs/using_antithesis/sdk/cpp/overview.html) SDK for C++ | | `ed25519-donna` | [Project](https://github.com/floodyberry/ed25519-donna) | [Ed25519](http://ed25519.cr.yp.to/) digital signatures | -| `rocksdb` | [Recipe](https://github.com/conan-io/conan-center-index/tree/master/recipes/rocksdb) | Fast key/value database. (Supports rotational disks better than NuDB.) | | `secp256k1` | [Project](https://github.com/bitcoin-core/secp256k1) | ECDSA digital signatures using the **secp256k1** curve | -| `snappy` | [Recipe](https://github.com/conan-io/conan-center-index/tree/master/recipes/snappy) | "Snappy" lossless compression algorithm. | -| `soci` | [Recipe](https://github.com/conan-io/conan-center-index/tree/master/recipes/soci) | Abstraction layer for database access. | diff --git a/external/snappy/conandata.yml b/external/snappy/conandata.yml deleted file mode 100644 index 1488c7a2ba..0000000000 --- a/external/snappy/conandata.yml +++ /dev/null @@ -1,40 +0,0 @@ -sources: - "1.1.10": - url: "https://github.com/google/snappy/archive/1.1.10.tar.gz" - sha256: "49d831bffcc5f3d01482340fe5af59852ca2fe76c3e05df0e67203ebbe0f1d90" - "1.1.9": - url: "https://github.com/google/snappy/archive/1.1.9.tar.gz" - sha256: "75c1fbb3d618dd3a0483bff0e26d0a92b495bbe5059c8b4f1c962b478b6e06e7" - "1.1.8": - url: "https://github.com/google/snappy/archive/1.1.8.tar.gz" - sha256: "16b677f07832a612b0836178db7f374e414f94657c138e6993cbfc5dcc58651f" - "1.1.7": - url: "https://github.com/google/snappy/archive/1.1.7.tar.gz" - sha256: "3dfa02e873ff51a11ee02b9ca391807f0c8ea0529a4924afa645fbf97163f9d4" -patches: - "1.1.10": - - patch_file: "patches/1.1.10-0001-fix-inlining-failure.patch" - patch_description: "disable inlining for compilation error" - patch_type: "portability" - - patch_file: "patches/1.1.9-0002-no-Werror.patch" - patch_description: "disable 'warning as error' options" - patch_type: "portability" - - patch_file: "patches/1.1.10-0003-fix-clobber-list-older-llvm.patch" - patch_description: "disable inline asm on apple-clang" - patch_type: "portability" - - patch_file: "patches/1.1.9-0004-rtti-by-default.patch" - patch_description: "remove 'disable rtti'" - patch_type: "conan" - "1.1.9": - - patch_file: "patches/1.1.9-0001-fix-inlining-failure.patch" - patch_description: "disable inlining for compilation error" - patch_type: "portability" - - patch_file: "patches/1.1.9-0002-no-Werror.patch" - patch_description: "disable 'warning as error' options" - patch_type: "portability" - - patch_file: "patches/1.1.9-0003-fix-clobber-list-older-llvm.patch" - patch_description: "disable inline asm on apple-clang" - patch_type: "portability" - - patch_file: "patches/1.1.9-0004-rtti-by-default.patch" - patch_description: "remove 'disable rtti'" - patch_type: "conan" diff --git a/external/snappy/conanfile.py b/external/snappy/conanfile.py deleted file mode 100644 index 23558639f4..0000000000 --- a/external/snappy/conanfile.py +++ /dev/null @@ -1,89 +0,0 @@ -from conan import ConanFile -from conan.tools.build import check_min_cppstd -from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout -from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rmdir -from conan.tools.scm import Version -import os - -required_conan_version = ">=1.54.0" - - -class SnappyConan(ConanFile): - name = "snappy" - description = "A fast compressor/decompressor" - topics = ("google", "compressor", "decompressor") - url = "https://github.com/conan-io/conan-center-index" - homepage = "https://github.com/google/snappy" - license = "BSD-3-Clause" - - package_type = "library" - settings = "os", "arch", "compiler", "build_type" - options = { - "shared": [True, False], - "fPIC": [True, False], - } - default_options = { - "shared": False, - "fPIC": True, - } - - def export_sources(self): - export_conandata_patches(self) - - def config_options(self): - if self.settings.os == 'Windows': - del self.options.fPIC - - def configure(self): - if self.options.shared: - self.options.rm_safe("fPIC") - - def layout(self): - cmake_layout(self, src_folder="src") - - def validate(self): - if self.settings.compiler.get_safe("cppstd"): - check_min_cppstd(self, 11) - - def source(self): - get(self, **self.conan_data["sources"][self.version], strip_root=True) - - def generate(self): - tc = CMakeToolchain(self) - tc.variables["SNAPPY_BUILD_TESTS"] = False - if Version(self.version) >= "1.1.8": - tc.variables["SNAPPY_FUZZING_BUILD"] = False - tc.variables["SNAPPY_REQUIRE_AVX"] = False - tc.variables["SNAPPY_REQUIRE_AVX2"] = False - tc.variables["SNAPPY_INSTALL"] = True - if Version(self.version) >= "1.1.9": - tc.variables["SNAPPY_BUILD_BENCHMARKS"] = False - tc.generate() - - def build(self): - apply_conandata_patches(self) - cmake = CMake(self) - cmake.configure() - cmake.build() - - def package(self): - copy(self, "COPYING", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses")) - cmake = CMake(self) - cmake.install() - rmdir(self, os.path.join(self.package_folder, "lib", "cmake")) - - def package_info(self): - self.cpp_info.set_property("cmake_file_name", "Snappy") - self.cpp_info.set_property("cmake_target_name", "Snappy::snappy") - # TODO: back to global scope in conan v2 once cmake_find_package* generators removed - self.cpp_info.components["snappylib"].libs = ["snappy"] - if not self.options.shared: - if self.settings.os in ["Linux", "FreeBSD"]: - self.cpp_info.components["snappylib"].system_libs.append("m") - - # TODO: to remove in conan v2 once cmake_find_package* generators removed - self.cpp_info.names["cmake_find_package"] = "Snappy" - self.cpp_info.names["cmake_find_package_multi"] = "Snappy" - self.cpp_info.components["snappylib"].names["cmake_find_package"] = "snappy" - self.cpp_info.components["snappylib"].names["cmake_find_package_multi"] = "snappy" - self.cpp_info.components["snappylib"].set_property("cmake_target_name", "Snappy::snappy") diff --git a/external/snappy/patches/1.1.10-0001-fix-inlining-failure.patch b/external/snappy/patches/1.1.10-0001-fix-inlining-failure.patch deleted file mode 100644 index 66b0f05521..0000000000 --- a/external/snappy/patches/1.1.10-0001-fix-inlining-failure.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/snappy-stubs-internal.h b/snappy-stubs-internal.h -index 1548ed7..3b4a9f3 100644 ---- a/snappy-stubs-internal.h -+++ b/snappy-stubs-internal.h -@@ -100,7 +100,7 @@ - - // Inlining hints. - #if HAVE_ATTRIBUTE_ALWAYS_INLINE --#define SNAPPY_ATTRIBUTE_ALWAYS_INLINE __attribute__((always_inline)) -+#define SNAPPY_ATTRIBUTE_ALWAYS_INLINE - #else - #define SNAPPY_ATTRIBUTE_ALWAYS_INLINE - #endif // HAVE_ATTRIBUTE_ALWAYS_INLINE diff --git a/external/snappy/patches/1.1.10-0003-fix-clobber-list-older-llvm.patch b/external/snappy/patches/1.1.10-0003-fix-clobber-list-older-llvm.patch deleted file mode 100644 index 969ce3805d..0000000000 --- a/external/snappy/patches/1.1.10-0003-fix-clobber-list-older-llvm.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/snappy.cc b/snappy.cc -index d414718..e4efb59 100644 ---- a/snappy.cc -+++ b/snappy.cc -@@ -1132,7 +1132,7 @@ inline size_t AdvanceToNextTagX86Optimized(const uint8_t** ip_p, size_t* tag) { - size_t literal_len = *tag >> 2; - size_t tag_type = *tag; - bool is_literal; --#if defined(__GCC_ASM_FLAG_OUTPUTS__) && defined(__x86_64__) -+#if defined(__GCC_ASM_FLAG_OUTPUTS__) && defined(__x86_64__) && ( (!defined(__clang__) && !defined(__APPLE__)) || (!defined(__APPLE__) && defined(__clang__) && (__clang_major__ >= 9)) || (defined(__APPLE__) && defined(__clang__) && (__clang_major__ > 11)) ) - // TODO clang misses the fact that the (c & 3) already correctly - // sets the zero flag. - asm("and $3, %k[tag_type]\n\t" diff --git a/external/snappy/patches/1.1.9-0001-fix-inlining-failure.patch b/external/snappy/patches/1.1.9-0001-fix-inlining-failure.patch deleted file mode 100644 index cdc119c0d5..0000000000 --- a/external/snappy/patches/1.1.9-0001-fix-inlining-failure.patch +++ /dev/null @@ -1,14 +0,0 @@ -Fixes the following error: -error: inlining failed in call to ‘always_inline’ ‘size_t snappy::AdvanceToNextTag(const uint8_t**, size_t*)’: function body can be overwritten at link time - ---- snappy-stubs-internal.h -+++ snappy-stubs-internal.h -@@ -100,7 +100,7 @@ - - // Inlining hints. - #ifdef HAVE_ATTRIBUTE_ALWAYS_INLINE --#define SNAPPY_ATTRIBUTE_ALWAYS_INLINE __attribute__((always_inline)) -+#define SNAPPY_ATTRIBUTE_ALWAYS_INLINE - #else - #define SNAPPY_ATTRIBUTE_ALWAYS_INLINE - #endif diff --git a/external/snappy/patches/1.1.9-0002-no-Werror.patch b/external/snappy/patches/1.1.9-0002-no-Werror.patch deleted file mode 100644 index d86e4e0a9d..0000000000 --- a/external/snappy/patches/1.1.9-0002-no-Werror.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- CMakeLists.txt -+++ CMakeLists.txt -@@ -69,7 +69,7 @@ -- # Use -Werror for clang only. -+if(0) - if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - if(NOT CMAKE_CXX_FLAGS MATCHES "-Werror") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") - endif(NOT CMAKE_CXX_FLAGS MATCHES "-Werror") - endif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") -- -+endif() diff --git a/external/snappy/patches/1.1.9-0003-fix-clobber-list-older-llvm.patch b/external/snappy/patches/1.1.9-0003-fix-clobber-list-older-llvm.patch deleted file mode 100644 index 84bc674fdd..0000000000 --- a/external/snappy/patches/1.1.9-0003-fix-clobber-list-older-llvm.patch +++ /dev/null @@ -1,12 +0,0 @@ -asm clobbers do not work for clang < 9 and apple-clang < 11 (found by SpaceIm) ---- snappy.cc -+++ snappy.cc -@@ -1026,7 +1026,7 @@ - size_t literal_len = *tag >> 2; - size_t tag_type = *tag; - bool is_literal; --#if defined(__GNUC__) && defined(__x86_64__) -+#if defined(__GNUC__) && defined(__x86_64__) && ( (!defined(__clang__) && !defined(__APPLE__)) || (!defined(__APPLE__) && defined(__clang__) && (__clang_major__ >= 9)) || (defined(__APPLE__) && defined(__clang__) && (__clang_major__ > 11)) ) - // TODO clang misses the fact that the (c & 3) already correctly - // sets the zero flag. - asm("and $3, %k[tag_type]\n\t" diff --git a/external/snappy/patches/1.1.9-0004-rtti-by-default.patch b/external/snappy/patches/1.1.9-0004-rtti-by-default.patch deleted file mode 100644 index c353a489d0..0000000000 --- a/external/snappy/patches/1.1.9-0004-rtti-by-default.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -53,8 +53,6 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - add_definitions(-D_HAS_EXCEPTIONS=0) - - # Disable RTTI. -- string(REGEX REPLACE "/GR" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") -- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR-") - else(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - # Use -Wall for clang and gcc. - if(NOT CMAKE_CXX_FLAGS MATCHES "-Wall") -@@ -78,8 +76,6 @@ endif() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") - - # Disable RTTI. -- string(REGEX REPLACE "-frtti" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") -- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti") - endif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - - # BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to make diff --git a/external/soci/conandata.yml b/external/soci/conandata.yml deleted file mode 100644 index 6eb59aaffa..0000000000 --- a/external/soci/conandata.yml +++ /dev/null @@ -1,12 +0,0 @@ -sources: - "4.0.3": - url: "https://github.com/SOCI/soci/archive/v4.0.3.tar.gz" - sha256: "4b1ff9c8545c5d802fbe06ee6cd2886630e5c03bf740e269bb625b45cf934928" -patches: - "4.0.3": - - patch_file: "patches/0001-Remove-hardcoded-INSTALL_NAME_DIR-for-relocatable-li.patch" - patch_description: "Generate relocatable libraries on MacOS" - patch_type: "portability" - - patch_file: "patches/0002-Fix-soci_backend.patch" - patch_description: "Fix variable names for dependencies" - patch_type: "conan" diff --git a/external/soci/conanfile.py b/external/soci/conanfile.py deleted file mode 100644 index fe4c54e53e..0000000000 --- a/external/soci/conanfile.py +++ /dev/null @@ -1,212 +0,0 @@ -from conan import ConanFile -from conan.tools.build import check_min_cppstd -from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain, cmake_layout -from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rmdir -from conan.tools.microsoft import is_msvc -from conan.tools.scm import Version -from conan.errors import ConanInvalidConfiguration -import os - -required_conan_version = ">=1.55.0" - - -class SociConan(ConanFile): - name = "soci" - homepage = "https://github.com/SOCI/soci" - url = "https://github.com/conan-io/conan-center-index" - description = "The C++ Database Access Library " - topics = ("mysql", "odbc", "postgresql", "sqlite3") - license = "BSL-1.0" - - settings = "os", "arch", "compiler", "build_type" - options = { - "shared": [True, False], - "fPIC": [True, False], - "empty": [True, False], - "with_sqlite3": [True, False], - "with_db2": [True, False], - "with_odbc": [True, False], - "with_oracle": [True, False], - "with_firebird": [True, False], - "with_mysql": [True, False], - "with_postgresql": [True, False], - "with_boost": [True, False], - } - default_options = { - "shared": False, - "fPIC": True, - "empty": False, - "with_sqlite3": False, - "with_db2": False, - "with_odbc": False, - "with_oracle": False, - "with_firebird": False, - "with_mysql": False, - "with_postgresql": False, - "with_boost": False, - } - - def export_sources(self): - export_conandata_patches(self) - - def layout(self): - cmake_layout(self, src_folder="src") - - def config_options(self): - if self.settings.os == "Windows": - self.options.rm_safe("fPIC") - - def configure(self): - if self.options.shared: - self.options.rm_safe("fPIC") - - def requirements(self): - if self.options.with_sqlite3: - self.requires("sqlite3/3.47.0") - if self.options.with_odbc and self.settings.os != "Windows": - self.requires("odbc/2.3.11") - if self.options.with_mysql: - self.requires("libmysqlclient/8.1.0") - if self.options.with_postgresql: - self.requires("libpq/15.5") - if self.options.with_boost: - self.requires("boost/1.86.0") - - @property - def _minimum_compilers_version(self): - return { - "Visual Studio": "14", - "gcc": "4.8", - "clang": "3.8", - "apple-clang": "8.0" - } - - def validate(self): - if self.settings.compiler.get_safe("cppstd"): - check_min_cppstd(self, 11) - - compiler = str(self.settings.compiler) - compiler_version = Version(self.settings.compiler.version.value) - if compiler not in self._minimum_compilers_version: - self.output.warning("{} recipe lacks information about the {} compiler support.".format(self.name, self.settings.compiler)) - elif compiler_version < self._minimum_compilers_version[compiler]: - raise ConanInvalidConfiguration("{} requires a {} version >= {}".format(self.name, compiler, compiler_version)) - - prefix = "Dependencies for" - message = "not configured in this conan package." - if self.options.with_db2: - # self.requires("db2/0.0.0") # TODO add support for db2 - raise ConanInvalidConfiguration("{} DB2 {} ".format(prefix, message)) - if self.options.with_oracle: - # self.requires("oracle_db/0.0.0") # TODO add support for oracle - raise ConanInvalidConfiguration("{} ORACLE {} ".format(prefix, message)) - if self.options.with_firebird: - # self.requires("firebird/0.0.0") # TODO add support for firebird - raise ConanInvalidConfiguration("{} firebird {} ".format(prefix, message)) - - def source(self): - get(self, **self.conan_data["sources"][self.version], strip_root=True) - - def generate(self): - tc = CMakeToolchain(self) - - tc.variables["SOCI_SHARED"] = self.options.shared - tc.variables["SOCI_STATIC"] = not self.options.shared - tc.variables["SOCI_TESTS"] = False - tc.variables["SOCI_CXX11"] = True - tc.variables["SOCI_EMPTY"] = self.options.empty - tc.variables["WITH_SQLITE3"] = self.options.with_sqlite3 - tc.variables["WITH_DB2"] = self.options.with_db2 - tc.variables["WITH_ODBC"] = self.options.with_odbc - tc.variables["WITH_ORACLE"] = self.options.with_oracle - tc.variables["WITH_FIREBIRD"] = self.options.with_firebird - tc.variables["WITH_MYSQL"] = self.options.with_mysql - tc.variables["WITH_POSTGRESQL"] = self.options.with_postgresql - tc.variables["WITH_BOOST"] = self.options.with_boost - tc.generate() - - deps = CMakeDeps(self) - deps.generate() - - def build(self): - apply_conandata_patches(self) - cmake = CMake(self) - cmake.configure() - cmake.build() - - def package(self): - copy(self, "LICENSE_1_0.txt", dst=os.path.join(self.package_folder, "licenses"), src=self.source_folder) - - cmake = CMake(self) - cmake.install() - - rmdir(self, os.path.join(self.package_folder, "lib", "cmake")) - - def package_info(self): - self.cpp_info.set_property("cmake_file_name", "SOCI") - - target_suffix = "" if self.options.shared else "_static" - lib_prefix = "lib" if is_msvc(self) and not self.options.shared else "" - version = Version(self.version) - lib_suffix = "_{}_{}".format(version.major, version.minor) if self.settings.os == "Windows" else "" - - # soci_core - self.cpp_info.components["soci_core"].set_property("cmake_target_name", "SOCI::soci_core{}".format(target_suffix)) - self.cpp_info.components["soci_core"].libs = ["{}soci_core{}".format(lib_prefix, lib_suffix)] - if self.options.with_boost: - self.cpp_info.components["soci_core"].requires.append("boost::headers") - - # soci_empty - if self.options.empty: - self.cpp_info.components["soci_empty"].set_property("cmake_target_name", "SOCI::soci_empty{}".format(target_suffix)) - self.cpp_info.components["soci_empty"].libs = ["{}soci_empty{}".format(lib_prefix, lib_suffix)] - self.cpp_info.components["soci_empty"].requires = ["soci_core"] - - # soci_sqlite3 - if self.options.with_sqlite3: - self.cpp_info.components["soci_sqlite3"].set_property("cmake_target_name", "SOCI::soci_sqlite3{}".format(target_suffix)) - self.cpp_info.components["soci_sqlite3"].libs = ["{}soci_sqlite3{}".format(lib_prefix, lib_suffix)] - self.cpp_info.components["soci_sqlite3"].requires = ["soci_core", "sqlite3::sqlite3"] - - # soci_odbc - if self.options.with_odbc: - self.cpp_info.components["soci_odbc"].set_property("cmake_target_name", "SOCI::soci_odbc{}".format(target_suffix)) - self.cpp_info.components["soci_odbc"].libs = ["{}soci_odbc{}".format(lib_prefix, lib_suffix)] - self.cpp_info.components["soci_odbc"].requires = ["soci_core"] - if self.settings.os == "Windows": - self.cpp_info.components["soci_odbc"].system_libs.append("odbc32") - else: - self.cpp_info.components["soci_odbc"].requires.append("odbc::odbc") - - # soci_mysql - if self.options.with_mysql: - self.cpp_info.components["soci_mysql"].set_property("cmake_target_name", "SOCI::soci_mysql{}".format(target_suffix)) - self.cpp_info.components["soci_mysql"].libs = ["{}soci_mysql{}".format(lib_prefix, lib_suffix)] - self.cpp_info.components["soci_mysql"].requires = ["soci_core", "libmysqlclient::libmysqlclient"] - - # soci_postgresql - if self.options.with_postgresql: - self.cpp_info.components["soci_postgresql"].set_property("cmake_target_name", "SOCI::soci_postgresql{}".format(target_suffix)) - self.cpp_info.components["soci_postgresql"].libs = ["{}soci_postgresql{}".format(lib_prefix, lib_suffix)] - self.cpp_info.components["soci_postgresql"].requires = ["soci_core", "libpq::libpq"] - - # TODO: to remove in conan v2 once cmake_find_package* generators removed - self.cpp_info.names["cmake_find_package"] = "SOCI" - self.cpp_info.names["cmake_find_package_multi"] = "SOCI" - self.cpp_info.components["soci_core"].names["cmake_find_package"] = "soci_core{}".format(target_suffix) - self.cpp_info.components["soci_core"].names["cmake_find_package_multi"] = "soci_core{}".format(target_suffix) - if self.options.empty: - self.cpp_info.components["soci_empty"].names["cmake_find_package"] = "soci_empty{}".format(target_suffix) - self.cpp_info.components["soci_empty"].names["cmake_find_package_multi"] = "soci_empty{}".format(target_suffix) - if self.options.with_sqlite3: - self.cpp_info.components["soci_sqlite3"].names["cmake_find_package"] = "soci_sqlite3{}".format(target_suffix) - self.cpp_info.components["soci_sqlite3"].names["cmake_find_package_multi"] = "soci_sqlite3{}".format(target_suffix) - if self.options.with_odbc: - self.cpp_info.components["soci_odbc"].names["cmake_find_package"] = "soci_odbc{}".format(target_suffix) - self.cpp_info.components["soci_odbc"].names["cmake_find_package_multi"] = "soci_odbc{}".format(target_suffix) - if self.options.with_mysql: - self.cpp_info.components["soci_mysql"].names["cmake_find_package"] = "soci_mysql{}".format(target_suffix) - self.cpp_info.components["soci_mysql"].names["cmake_find_package_multi"] = "soci_mysql{}".format(target_suffix) - if self.options.with_postgresql: - self.cpp_info.components["soci_postgresql"].names["cmake_find_package"] = "soci_postgresql{}".format(target_suffix) - self.cpp_info.components["soci_postgresql"].names["cmake_find_package_multi"] = "soci_postgresql{}".format(target_suffix) diff --git a/external/soci/patches/0001-Remove-hardcoded-INSTALL_NAME_DIR-for-relocatable-li.patch b/external/soci/patches/0001-Remove-hardcoded-INSTALL_NAME_DIR-for-relocatable-li.patch deleted file mode 100644 index 5de0027f75..0000000000 --- a/external/soci/patches/0001-Remove-hardcoded-INSTALL_NAME_DIR-for-relocatable-li.patch +++ /dev/null @@ -1,39 +0,0 @@ -From d491bf7b5040d314ffd0c6310ba01f78ff44c85e Mon Sep 17 00:00:00 2001 -From: Rasmus Thomsen -Date: Fri, 14 Apr 2023 09:16:29 +0200 -Subject: [PATCH] Remove hardcoded INSTALL_NAME_DIR for relocatable libraries - on MacOS - ---- - cmake/SociBackend.cmake | 2 +- - src/core/CMakeLists.txt | 1 - - 2 files changed, 1 insertion(+), 2 deletions(-) - -diff --git a/cmake/SociBackend.cmake b/cmake/SociBackend.cmake -index 5d4ef0df..39fe1f77 100644 ---- a/cmake/SociBackend.cmake -+++ b/cmake/SociBackend.cmake -@@ -171,7 +171,7 @@ macro(soci_backend NAME) - set_target_properties(${THIS_BACKEND_TARGET} - PROPERTIES - SOVERSION ${${PROJECT_NAME}_SOVERSION} -- INSTALL_NAME_DIR ${CMAKE_INSTALL_PREFIX}/lib) -+ ) - - if(APPLE) - set_target_properties(${THIS_BACKEND_TARGET} -diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt -index 3e7deeae..f9eae564 100644 ---- a/src/core/CMakeLists.txt -+++ b/src/core/CMakeLists.txt -@@ -59,7 +59,6 @@ if (SOCI_SHARED) - PROPERTIES - VERSION ${SOCI_VERSION} - SOVERSION ${SOCI_SOVERSION} -- INSTALL_NAME_DIR ${CMAKE_INSTALL_PREFIX}/lib - CLEAN_DIRECT_OUTPUT 1) - endif() - --- -2.25.1 - diff --git a/external/soci/patches/0002-Fix-soci_backend.patch b/external/soci/patches/0002-Fix-soci_backend.patch deleted file mode 100644 index eab3c3763c..0000000000 --- a/external/soci/patches/0002-Fix-soci_backend.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/cmake/SociBackend.cmake b/cmake/SociBackend.cmake -index 0a664667..3fa2ed95 100644 ---- a/cmake/SociBackend.cmake -+++ b/cmake/SociBackend.cmake -@@ -31,14 +31,13 @@ macro(soci_backend_deps_found NAME DEPS SUCCESS) - if(NOT DEPEND_FOUND) - list(APPEND DEPS_NOT_FOUND ${dep}) - else() -- string(TOUPPER "${dep}" DEPU) -- if( ${DEPU}_INCLUDE_DIR ) -- list(APPEND DEPS_INCLUDE_DIRS ${${DEPU}_INCLUDE_DIR}) -+ if( ${dep}_INCLUDE_DIR ) -+ list(APPEND DEPS_INCLUDE_DIRS ${${dep}_INCLUDE_DIR}) - endif() -- if( ${DEPU}_INCLUDE_DIRS ) -- list(APPEND DEPS_INCLUDE_DIRS ${${DEPU}_INCLUDE_DIRS}) -+ if( ${dep}_INCLUDE_DIRS ) -+ list(APPEND DEPS_INCLUDE_DIRS ${${dep}_INCLUDE_DIRS}) - endif() -- list(APPEND DEPS_LIBRARIES ${${DEPU}_LIBRARIES}) -+ list(APPEND DEPS_LIBRARIES ${${dep}_LIBRARIES}) - endif() - endforeach() -