Add xrpld build option and Conan package test (#5052)

* Make xrpld target optional

* Add job to test Conan recipe

* [fold] address review comments

* [fold] Enable tests in workflows

* [fold] Rename with_xrpld option

* [fold] Fix grep expression
This commit is contained in:
John Freeman
2024-07-11 17:04:30 -05:00
committed by GitHub
parent e8602b81fa
commit f3bcc651c7
10 changed files with 210 additions and 66 deletions

View File

@@ -20,6 +20,8 @@ runs:
${{ inputs.generator && format('-G "{0}"', inputs.generator) || '' }} \ ${{ inputs.generator && format('-G "{0}"', inputs.generator) || '' }} \
-DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \ -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \
-DCMAKE_BUILD_TYPE=${{ inputs.configuration }} \ -DCMAKE_BUILD_TYPE=${{ inputs.configuration }} \
-Dtests=TRUE \
-Dxrpld=TRUE \
${{ inputs.cmake-args }} \ ${{ inputs.cmake-args }} \
.. ..
- name: build - name: build

View File

@@ -50,6 +50,8 @@ runs:
conan install \ conan install \
--output-folder . \ --output-folder . \
--build missing \ --build missing \
--options tests=True \
--options xrpld=True \
--settings build_type=${{ inputs.configuration }} \ --settings build_type=${{ inputs.configuration }} \
.. ..
- name: upload dependencies to remote - name: upload dependencies to remote

View File

@@ -232,3 +232,53 @@ jobs:
token: ${{ secrets.CODECOV_TOKEN }} token: ${{ secrets.CODECOV_TOKEN }}
attempt_limit: 5 attempt_limit: 5
attempt_delay: 210000 # in milliseconds attempt_delay: 210000 # in milliseconds
conan:
needs: dependencies
runs-on: [self-hosted, heavy]
container: rippleci/rippled-build-ubuntu:aaf5e3e
env:
build_dir: .build
configuration: Release
steps:
- name: download cache
uses: actions/download-artifact@v3
with:
name: linux-gcc-${{ env.configuration }}
- name: extract cache
run: |
mkdir -p ~/.conan
tar -xzf conan.tar -C ~/.conan
- name: check environment
run: |
env | sort
echo ${PATH} | tr ':' '\n'
conan --version
cmake --version
- name: checkout
uses: actions/checkout@v4
- name: dependencies
uses: ./.github/actions/dependencies
env:
CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
with:
configuration: ${{ env.configuration }}
- name: export
run: |
version=$(conan inspect --raw version .)
reference="xrpl/${version}@local/test"
conan remove -f ${reference} || true
conan export . local/test
echo "reference=${reference}" >> "${GITHUB_ENV}"
- name: build
run: |
cd examples/example
mkdir ${build_dir}
cd ${build_dir}
conan install .. --output-folder . \
--require-override ${reference} --build missing
cmake .. \
-DCMAKE_TOOLCHAIN_FILE:FILEPATH=./build/${configuration}/generators/conan_toolchain.cmake \
-DCMAKE_BUILD_TYPE=${configuration}
cmake --build .
./example | grep '^[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+'

View File

@@ -91,57 +91,59 @@ target_link_libraries(xrpl.libxrpl
xxHash::xxhash xxHash::xxhash
) )
add_executable(rippled) if(xrpld)
if(unity) add_executable(rippled)
set_target_properties(rippled PROPERTIES UNITY_BUILD ON) if(unity)
endif() set_target_properties(rippled PROPERTIES UNITY_BUILD ON)
if(tests) endif()
target_compile_definitions(rippled PUBLIC ENABLE_TESTS) if(tests)
endif() target_compile_definitions(rippled PUBLIC ENABLE_TESTS)
target_include_directories(rippled endif()
PRIVATE target_include_directories(rippled
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src> PRIVATE
) $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
)
file(GLOB_RECURSE sources CONFIGURE_DEPENDS
"${CMAKE_CURRENT_SOURCE_DIR}/src/xrpld/*.cpp"
)
target_sources(rippled PRIVATE ${sources})
if(tests)
file(GLOB_RECURSE sources CONFIGURE_DEPENDS file(GLOB_RECURSE sources CONFIGURE_DEPENDS
"${CMAKE_CURRENT_SOURCE_DIR}/src/test/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/src/xrpld/*.cpp"
) )
target_sources(rippled PRIVATE ${sources}) target_sources(rippled PRIVATE ${sources})
endif()
target_link_libraries(rippled if(tests)
Ripple::boost file(GLOB_RECURSE sources CONFIGURE_DEPENDS
Ripple::opts "${CMAKE_CURRENT_SOURCE_DIR}/src/test/*.cpp"
Ripple::libs )
xrpl.libxrpl target_sources(rippled PRIVATE ${sources})
) endif()
exclude_if_included(rippled)
# define a macro for tests that might need to
# be exluded or run differently in CI environment
if(is_ci)
target_compile_definitions(rippled PRIVATE RIPPLED_RUNNING_IN_CI)
endif ()
if(reporting) target_link_libraries(rippled
set(suffix -reporting) Ripple::boost
set_target_properties(rippled PROPERTIES OUTPUT_NAME rippled-reporting) Ripple::opts
get_target_property(BIN_NAME rippled OUTPUT_NAME) Ripple::libs
message(STATUS "Reporting mode build: rippled renamed ${BIN_NAME}") xrpl.libxrpl
target_compile_definitions(rippled PRIVATE RIPPLED_REPORTING) )
endif() exclude_if_included(rippled)
# define a macro for tests that might need to
# be exluded or run differently in CI environment
if(is_ci)
target_compile_definitions(rippled PRIVATE RIPPLED_RUNNING_IN_CI)
endif ()
# any files that don't play well with unity should be added here if(reporting)
if(tests) set(suffix -reporting)
set_source_files_properties( set_target_properties(rippled PROPERTIES OUTPUT_NAME rippled-reporting)
# these two seem to produce conflicts in beast teardown template methods get_target_property(BIN_NAME rippled OUTPUT_NAME)
src/test/rpc/ValidatorRPC_test.cpp message(STATUS "Reporting mode build: rippled renamed ${BIN_NAME}")
src/test/rpc/ShardArchiveHandler_test.cpp target_compile_definitions(rippled PRIVATE RIPPLED_REPORTING)
src/test/ledger/Invariants_test.cpp endif()
PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE)
# any files that don't play well with unity should be added here
if(tests)
set_source_files_properties(
# these two seem to produce conflicts in beast teardown template methods
src/test/rpc/ValidatorRPC_test.cpp
src/test/rpc/ShardArchiveHandler_test.cpp
src/test/ledger/Invariants_test.cpp
PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE)
endif()
endif() endif()

View File

@@ -21,6 +21,13 @@ install(
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
) )
if(NOT WIN32)
install(
CODE "file(CREATE_LINK xrpl \
\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/ripple SYMBOLIC)"
)
endif()
install (EXPORT RippleExports install (EXPORT RippleExports
FILE RippleTargets.cmake FILE RippleTargets.cmake
NAMESPACE Ripple:: NAMESPACE Ripple::
@@ -31,14 +38,9 @@ write_basic_package_version_file (
VERSION ${rippled_version} VERSION ${rippled_version}
COMPATIBILITY SameMajorVersion) COMPATIBILITY SameMajorVersion)
if (is_root_project) if (is_root_project AND TARGET rippled)
install (TARGETS rippled RUNTIME DESTINATION bin) install (TARGETS rippled RUNTIME DESTINATION bin)
set_target_properties(rippled PROPERTIES INSTALL_RPATH_USE_LINK_PATH ON) set_target_properties(rippled PROPERTIES INSTALL_RPATH_USE_LINK_PATH ON)
install (
FILES
${CMAKE_CURRENT_SOURCE_DIR}/cmake/RippleConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/RippleConfigVersion.cmake
DESTINATION lib/cmake/ripple)
# sample configs should not overwrite existing files # sample configs should not overwrite existing files
# install if-not-exists workaround as suggested by # install if-not-exists workaround as suggested by
# https://cmake.org/Bug/view.php?id=12646 # https://cmake.org/Bug/view.php?id=12646
@@ -53,18 +55,16 @@ if (is_root_project)
copy_if_not_exists(\"${CMAKE_CURRENT_SOURCE_DIR}/cfg/rippled-example.cfg\" etc rippled.cfg) copy_if_not_exists(\"${CMAKE_CURRENT_SOURCE_DIR}/cfg/rippled-example.cfg\" etc rippled.cfg)
copy_if_not_exists(\"${CMAKE_CURRENT_SOURCE_DIR}/cfg/validators-example.txt\" etc validators.txt) copy_if_not_exists(\"${CMAKE_CURRENT_SOURCE_DIR}/cfg/validators-example.txt\" etc validators.txt)
") ")
if(NOT WIN32)
install(
CODE "file(CREATE_LINK rippled${suffix} \
\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/xrpld${suffix} SYMBOLIC)"
)
endif()
endif () endif ()
if(NOT WIN32) install (
install( FILES
CODE "file(CREATE_LINK xrpl \ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RippleConfig.cmake
\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/ripple SYMBOLIC)" ${CMAKE_CURRENT_BINARY_DIR}/RippleConfigVersion.cmake
) DESTINATION lib/cmake/ripple)
endif()
if(NOT WIN32)
install(
CODE "file(CREATE_LINK rippled${suffix} \
\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/xrpld${suffix} SYMBOLIC)"
)
endif()

View File

@@ -8,6 +8,8 @@ ProcessorCount(PROCESSOR_COUNT)
option(assert "Enables asserts, even in release builds" OFF) option(assert "Enables asserts, even in release builds" OFF)
option(xrpld "Build xrpld" ON)
option(reporting "Build rippled with reporting mode enabled" OFF) option(reporting "Build rippled with reporting mode enabled" OFF)
option(tests "Build tests" ON) option(tests "Build tests" ON)

View File

@@ -21,6 +21,7 @@ class Xrpl(ConanFile):
'static': [True, False], 'static': [True, False],
'tests': [True, False], 'tests': [True, False],
'unity': [True, False], 'unity': [True, False],
'xrpld': [True, False],
} }
requires = [ requires = [
@@ -47,8 +48,9 @@ class Xrpl(ConanFile):
'rocksdb': True, 'rocksdb': True,
'shared': False, 'shared': False,
'static': True, 'static': True,
'tests': True, 'tests': False,
'unity': False, 'unity': False,
'xrpld': False,
'cassandra-cpp-driver/*:shared': False, 'cassandra-cpp-driver/*:shared': False,
'cassandra-cpp-driver/*:use_atomic': None, 'cassandra-cpp-driver/*:use_atomic': None,
@@ -142,6 +144,7 @@ class Xrpl(ConanFile):
tc.variables['BUILD_SHARED_LIBS'] = self.options.shared tc.variables['BUILD_SHARED_LIBS'] = self.options.shared
tc.variables['static'] = self.options.static tc.variables['static'] = self.options.static
tc.variables['unity'] = self.options.unity tc.variables['unity'] = self.options.unity
tc.variables['xrpld'] = self.options.xrpld
tc.generate() tc.generate()
def build(self): def build(self):

View File

@@ -0,0 +1,16 @@
cmake_minimum_required(VERSION 3.21)
set(name example)
set(version 0.1.0)
project(
${name}
VERSION ${version}
LANGUAGES CXX
)
find_package(xrpl REQUIRED)
add_executable(example)
target_sources(example PRIVATE src/example.cpp)
target_link_libraries(example PRIVATE xrpl::libxrpl)

View File

@@ -0,0 +1,59 @@
from conan import ConanFile, conan_version
from conan.tools.cmake import CMake, cmake_layout
class Example(ConanFile):
def set_name(self):
if self.name is None:
self.name = 'example'
def set_version(self):
if self.version is None:
self.version = '0.1.0'
license = 'ISC'
author = 'John Freeman <jfreeman08@gmail.com>'
settings = 'os', 'compiler', 'build_type', 'arch'
options = {'shared': [True, False], 'fPIC': [True, False]}
default_options = {
'shared': False,
'fPIC': True,
'xrpl:xrpld': False,
}
requires = ['xrpl/2.2.0-rc1@jfreeman/nodestore']
generators = ['CMakeDeps', 'CMakeToolchain']
exports_sources = [
'CMakeLists.txt',
'cmake/*',
'external/*',
'include/*',
'src/*',
]
# For out-of-source build.
# https://docs.conan.io/en/latest/reference/build_helpers/cmake.html#configure
no_copy_source = True
def layout(self):
cmake_layout(self)
def config_options(self):
if self.settings.os == 'Windows':
del self.options.fPIC
def build(self):
cmake = CMake(self)
cmake.configure(variables={'BUILD_TESTING': 'NO'})
cmake.build()
def package(self):
cmake = CMake(self)
cmake.install()
def package_info(self):
path = f'{self.package_folder}/share/{self.name}/cpp_info.py'
with open(path, 'r') as file:
exec(file.read(), {}, {'self': self.cpp_info})

View File

@@ -0,0 +1,8 @@
#include <cstdio>
#include <xrpl/protocol/BuildInfo.h>
int main(int argc, char const** argv) {
std::printf("%s\n", ripple::BuildInfo::getVersionString().c_str());
return 0;
}