From 2977cbb4118c2084748aa7eb29bb9709591e4baa Mon Sep 17 00:00:00 2001 From: Bart Thomee <11445373+bthomee@users.noreply.github.com> Date: Thu, 31 Jul 2025 15:57:02 -0400 Subject: [PATCH 1/5] Remove external libraries hosted in our conan center index fork --- .github/actions/dependencies/action.yml | 3 - .github/workflows/libxrpl.yml | 2 +- .github/workflows/macos.yml | 7 +- .github/workflows/nix.yml | 2 +- .github/workflows/windows.yml | 7 +- BUILD.md | 17 -- external/README.md | 8 +- external/snappy/conandata.yml | 40 ---- external/snappy/conanfile.py | 89 -------- .../1.1.10-0001-fix-inlining-failure.patch | 13 -- ....10-0003-fix-clobber-list-older-llvm.patch | 13 -- .../1.1.9-0001-fix-inlining-failure.patch | 14 -- .../snappy/patches/1.1.9-0002-no-Werror.patch | 12 - ...1.9-0003-fix-clobber-list-older-llvm.patch | 12 - .../patches/1.1.9-0004-rtti-by-default.patch | 20 -- external/soci/conandata.yml | 12 - external/soci/conanfile.py | 212 ------------------ ...-INSTALL_NAME_DIR-for-relocatable-li.patch | 39 ---- .../soci/patches/0002-Fix-soci_backend.patch | 24 -- 19 files changed, 6 insertions(+), 540 deletions(-) delete mode 100644 external/snappy/conandata.yml delete mode 100644 external/snappy/conanfile.py delete mode 100644 external/snappy/patches/1.1.10-0001-fix-inlining-failure.patch delete mode 100644 external/snappy/patches/1.1.10-0003-fix-clobber-list-older-llvm.patch delete mode 100644 external/snappy/patches/1.1.9-0001-fix-inlining-failure.patch delete mode 100644 external/snappy/patches/1.1.9-0002-no-Werror.patch delete mode 100644 external/snappy/patches/1.1.9-0003-fix-clobber-list-older-llvm.patch delete mode 100644 external/snappy/patches/1.1.9-0004-rtti-by-default.patch delete mode 100644 external/soci/conandata.yml delete mode 100644 external/soci/conanfile.py delete mode 100644 external/soci/patches/0001-Remove-hardcoded-INSTALL_NAME_DIR-for-relocatable-li.patch delete mode 100644 external/soci/patches/0002-Fix-soci_backend.patch diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index 7ece9710a8..8ac29646b6 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -8,9 +8,6 @@ runs: 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 if: env.CONAN_URL != '' shell: bash diff --git a/.github/workflows/libxrpl.yml b/.github/workflows/libxrpl.yml index 79cd872210..4a2af4ac45 100644 --- a/.github/workflows/libxrpl.yml +++ b/.github/workflows/libxrpl.yml @@ -1,6 +1,6 @@ name: Check libXRPL compatibility with Clio env: - CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/dev + CONAN_URL: https://conan.ripplex.io CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }} CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }} on: diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index adea15af9e..0603930dda 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -18,7 +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_URL: https://conan.ripplex.io CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }} CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }} CONAN_GLOBAL_CONF: | @@ -90,11 +90,6 @@ jobs: 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 diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index d6490e4caa..c28ea76e5f 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -19,7 +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_URL: https://conan.ripplex.io CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }} CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }} CONAN_GLOBAL_CONF: | diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 84a91bcb4e..67d7e221ae 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -21,7 +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_URL: https://conan.ripplex.io CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }} CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }} CONAN_GLOBAL_CONF: | @@ -85,11 +85,6 @@ jobs: 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 diff --git a/BUILD.md b/BUILD.md index 072e38af93..c1abcffc8e 100644 --- a/BUILD.md +++ b/BUILD.md @@ -162,23 +162,6 @@ Replace `` with paths to the desired compilers: - `conan profile update env.CC= default` - `conan profile update env.CXX= default` -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. - - ``` - # Conan 2.x - conan export --version 1.1.10 external/snappy - ``` - -Export our [Conan recipe for SOCI](./external/soci). -It patches their CMake to correctly import its dependencies. - - ``` - # Conan 2.x - conan export --version 4.0.3 external/soci - ``` - ### Build and Test 1. Create a build directory and move into it. 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() - From 780963d5db0702706ad5ec4e5d97743602b8ba53 Mon Sep 17 00:00:00 2001 From: Bart Thomee <11445373+bthomee@users.noreply.github.com> Date: Thu, 31 Jul 2025 16:38:47 -0400 Subject: [PATCH 2/5] Update Conan remote --- .github/actions/dependencies/action.yml | 22 ++++++++++------------ .github/workflows/macos.yml | 10 ---------- .github/workflows/windows.yml | 10 ---------- 3 files changed, 10 insertions(+), 32 deletions(-) diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index 8ac29646b6..b353664573 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -6,25 +6,23 @@ inputs: runs: using: composite steps: - - name: export custom recipes - shell: bash - - 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 remove xrplf + echo "Removed conan remote xrplf" 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 != '' + conan remote add --index 0 xrplf "${CONAN_URL}" + echo "Added conan remote xrplf at ${CONAN_URL}" + - name: try to authenticate to Conan remote + if: env.CONAN_LOGIN_USERNAME_XRPLF != '' && env.CONAN_PASSWORD_XRPLF != '' id: remote shell: bash run: | - echo "Authenticating to ripple remote..." - conan remote auth ripple --force + echo "Authenticating to xrplf remote..." + conan remote auth xrplf --force conan remote list-users - name: list missing binaries id: binaries diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 0603930dda..5e986fd443 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -90,16 +90,6 @@ jobs: echo "${CONAN_GLOBAL_CONF}" >> $(conan config home)/global.conf conan config install conan/profiles/ -tf $(conan config home)/profiles/ conan profile show - - 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/windows.yml b/.github/workflows/windows.yml index 67d7e221ae..885e7d3701 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -85,16 +85,6 @@ jobs: echo "${CONAN_GLOBAL_CONF}" >> $(conan config home)/global.conf conan config install conan/profiles/ -tf $(conan config home)/profiles/ conan profile show - - 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: From 88361aa9ed810721a14bbafc045a96ecad20c866 Mon Sep 17 00:00:00 2001 From: Bart Thomee <11445373+bthomee@users.noreply.github.com> Date: Sat, 2 Aug 2025 13:01:23 -0400 Subject: [PATCH 3/5] Remove unnecessary authentication for read-only remote access, and update remote name --- .github/actions/dependencies/action.yml | 8 -------- .github/workflows/libxrpl.yml | 14 +++++++------- .github/workflows/macos.yml | 2 -- .github/workflows/nix.yml | 2 -- .github/workflows/windows.yml | 2 -- 5 files changed, 7 insertions(+), 21 deletions(-) diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index b353664573..527d626f0d 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -16,14 +16,6 @@ runs: fi conan remote add --index 0 xrplf "${CONAN_URL}" echo "Added conan remote xrplf at ${CONAN_URL}" - - name: try to authenticate to Conan remote - if: env.CONAN_LOGIN_USERNAME_XRPLF != '' && env.CONAN_PASSWORD_XRPLF != '' - id: remote - shell: bash - run: | - echo "Authenticating to xrplf remote..." - conan remote auth xrplf --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 4a2af4ac45..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: https://conan.ripplex.io - CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }} - CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }} + 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 5e986fd443..60fb386248 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -19,8 +19,6 @@ concurrency: # to pollute conan/profiles directory with settings which might not work for others env: CONAN_URL: https://conan.ripplex.io - CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }} - CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }} CONAN_GLOBAL_CONF: | core.download:parallel={{os.cpu_count()}} core.upload:parallel={{os.cpu_count()}} diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index c28ea76e5f..14e98e3fb0 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -20,8 +20,6 @@ concurrency: # to pollute conan/profiles directory with settings which might not work for others env: CONAN_URL: https://conan.ripplex.io - CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }} - CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }} 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 885e7d3701..729b8d7b63 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -22,8 +22,6 @@ concurrency: # to pollute conan/profiles directory with settings which might not work for others env: CONAN_URL: https://conan.ripplex.io - CONAN_LOGIN_USERNAME_RIPPLE: ${{ secrets.CONAN_USERNAME }} - CONAN_PASSWORD_RIPPLE: ${{ secrets.CONAN_TOKEN }} CONAN_GLOBAL_CONF: | core.download:parallel={{os.cpu_count()}} core.upload:parallel={{os.cpu_count()}} From df3df54806d3468901b330f14e003fb99d84b70e Mon Sep 17 00:00:00 2001 From: Bart Thomee <11445373+bthomee@users.noreply.github.com> Date: Wed, 6 Aug 2025 06:35:35 -0400 Subject: [PATCH 4/5] Add instructions on how to fetch updated recipes from CCI fork --- .github/actions/dependencies/action.yml | 11 ++++++----- .github/workflows/macos.yml | 2 +- .github/workflows/windows.yml | 2 +- BUILD.md | 21 ++++++++++++++++----- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index 527d626f0d..e32d8934ba 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -10,12 +10,13 @@ runs: if: env.CONAN_URL != '' shell: bash run: | - if conan remote list | grep -q "xrplf"; then - conan remote remove xrplf - echo "Removed conan remote xrplf" + 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 xrplf "${CONAN_URL}" - echo "Added conan remote xrplf at ${CONAN_URL}" - name: list missing binaries id: binaries shell: bash diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 60fb386248..c056468fc6 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -85,7 +85,7 @@ 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: build dependencies diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 729b8d7b63..4de92c8049 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -80,7 +80,7 @@ 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: build dependencies diff --git a/BUILD.md b/BUILD.md index aa18767397..45d501a5de 100644 --- a/BUILD.md +++ b/BUILD.md @@ -132,15 +132,26 @@ can do this by running: conan remote add --index 0 xrplf "https://conan.ripplex.io" ``` -Alternatively, you can use the `conan export` command to add the patched recipes -that are also (for the time being) located in the `external/` directory to your -local Conan cache: +Alternatively, you can pull the patched recipes into the repository and use them +locally: ```bash -conan export --version 1.1.10 external/snappy -conan export --version 4.0.3 external/soci +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, it will be necessary +for you to pull in the changes and re-export the updated dependencies with the +newer version. + ### Conan profile tweaks #### Missing compiler version From 5fefc85d9bc16dc06d6dcd4a51e3a65826956eff Mon Sep 17 00:00:00 2001 From: Bart Thomee <11445373+bthomee@users.noreply.github.com> Date: Wed, 6 Aug 2025 08:30:30 -0400 Subject: [PATCH 5/5] Fix link in documentation --- BUILD.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BUILD.md b/BUILD.md index 45d501a5de..63edcc1126 100644 --- a/BUILD.md +++ b/BUILD.md @@ -536,7 +536,7 @@ After any updates or changes to dependencies, you may need to do the following: conan remove '*' ``` -3. Re-run [conan export](#export-updated-recipes) +3. Re-run [conan export](#patched-recipes) if needed. 4. Re-run [conan install](#build-and-test). ### `protobuf/port_def.inc` file not found