mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-09 05:35:51 +00:00
Compare commits
358 Commits
2.0.0
...
Bronek/add
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c365da1208 | ||
|
|
8bfaa7fe0a | ||
|
|
c9135a63cd | ||
|
|
452263eaa5 | ||
|
|
8aa94ea09a | ||
|
|
258ba71363 | ||
|
|
b8626ea3c6 | ||
|
|
6534757d85 | ||
|
|
8e94ea3154 | ||
|
|
b113190563 | ||
|
|
358b7f50a7 | ||
|
|
f47e2f4e82 | ||
|
|
a7eea9546f | ||
|
|
9874d47d7f | ||
|
|
c2f3e2e263 | ||
|
|
e18f27f5f7 | ||
|
|
df6daf0d8f | ||
|
|
e9d46f0bfc | ||
|
|
42fd74b77b | ||
|
|
c55ea56c5e | ||
|
|
1e01cd34f7 | ||
|
|
e2fa5c1b7c | ||
|
|
fc0984d286 | ||
|
|
8b3dcd41f7 | ||
|
|
8f2f5310e2 | ||
|
|
edb4f0342c | ||
|
|
ea17abb92a | ||
|
|
35a40a8e62 | ||
|
|
d494bf45b2 | ||
|
|
8bf4a5cbff | ||
|
|
58c2c82a30 | ||
|
|
11edaa441d | ||
|
|
a5e953b191 | ||
|
|
506ae12a8c | ||
|
|
0310c5cbe0 | ||
|
|
053e1af7ff | ||
|
|
7e24adbdd0 | ||
|
|
621df422a7 | ||
|
|
0a34b5c691 | ||
|
|
e0bc3dd51f | ||
|
|
dacecd24ba | ||
|
|
05105743e9 | ||
|
|
9e1fe9a85e | ||
|
|
d71ce51901 | ||
|
|
be668ee26d | ||
|
|
cae5294b4e | ||
|
|
cd777f79ef | ||
|
|
8b9e21e3f5 | ||
|
|
2a61aee562 | ||
|
|
40ce8a8833 | ||
|
|
7713ff8c5c | ||
|
|
70371a4344 | ||
|
|
e514de76ed | ||
|
|
dd62cfcc22 | ||
|
|
09690f1b38 | ||
|
|
380ba9f1c1 | ||
|
|
c3e9380fb4 | ||
|
|
e3ebc253fa | ||
|
|
c6c7c84355 | ||
|
|
28f50cb7cf | ||
|
|
3e152fec74 | ||
|
|
2db2791805 | ||
|
|
9ec2d7f8ff | ||
|
|
4a084ce34c | ||
|
|
3502df2174 | ||
|
|
fa1e25abef | ||
|
|
217ba8dd4d | ||
|
|
405f4613d8 | ||
|
|
cba512068b | ||
|
|
1c99ea23d1 | ||
|
|
c4308b216f | ||
|
|
aafd2d8525 | ||
|
|
a574ec6023 | ||
|
|
e429455f4d | ||
|
|
7692eeb9a0 | ||
|
|
a099f5a804 | ||
|
|
ca0bc767fe | ||
|
|
4ba9288935 | ||
|
|
e923ec6d36 | ||
|
|
851d99d99e | ||
|
|
f608e653ca | ||
|
|
72e076b694 | ||
|
|
6cf37c4abe | ||
|
|
fc204773d6 | ||
|
|
2bc5cb240f | ||
|
|
67028d6ea6 | ||
|
|
d22a5057b9 | ||
|
|
75a20194c5 | ||
|
|
7fe81fe62e | ||
|
|
345ddc7234 | ||
|
|
d167d4864f | ||
|
|
bf504912a4 | ||
|
|
a7fb8ae915 | ||
|
|
d9b7a2688f | ||
|
|
c0299dba88 | ||
|
|
c3ecdb4746 | ||
|
|
c17676a9be | ||
|
|
ed8e32cc92 | ||
|
|
2406b28e64 | ||
|
|
2216e5a13f | ||
|
|
5bf3a308d5 | ||
|
|
53ea31c69a | ||
|
|
c1c2b5bf52 | ||
|
|
af018c7b0b | ||
|
|
0a1ca0600f | ||
|
|
cd7c62818b | ||
|
|
37d06bcce8 | ||
|
|
9745718467 | ||
|
|
ab44cc31e2 | ||
|
|
dce3e1efa6 | ||
|
|
159dfb5acb | ||
|
|
844646dc50 | ||
|
|
01fc8f2209 | ||
|
|
43e1d4440e | ||
|
|
466849efe8 | ||
|
|
db0fad6826 | ||
|
|
dd5e6559dd | ||
|
|
7c9d652d9b | ||
|
|
dc9e6c37fe | ||
|
|
01fe9477f4 | ||
|
|
97e3dae6f4 | ||
|
|
e8e7888a23 | ||
|
|
b02b8d016c | ||
|
|
a079bac153 | ||
|
|
3a55a64e1c | ||
|
|
fa5a85439f | ||
|
|
81034596a8 | ||
|
|
0968cdf340 | ||
|
|
d9e4009e33 | ||
|
|
02387fd227 | ||
|
|
fb3713bc25 | ||
|
|
f6d63082c0 | ||
|
|
33e1c42599 | ||
|
|
1b75dc8bcd | ||
|
|
3d02580c09 | ||
|
|
8458233a31 | ||
|
|
cb0ddbf863 | ||
|
|
dcc4581220 | ||
|
|
50b8f19cb5 | ||
|
|
f3e201f983 | ||
|
|
b14c24960b | ||
|
|
b6e3453f49 | ||
|
|
ed4870cdb4 | ||
|
|
5fbee8c824 | ||
|
|
3868c04e99 | ||
|
|
409c1d5aa2 | ||
|
|
20710f5232 | ||
|
|
870882f567 | ||
|
|
e1e67b2c9e | ||
|
|
eac3abdca9 | ||
|
|
ebd8e63276 | ||
|
|
839d17e7bd | ||
|
|
7be5c31bc6 | ||
|
|
9e4a7d5871 | ||
|
|
ff8b9aa439 | ||
|
|
ccc0889803 | ||
|
|
07f118caec | ||
|
|
58af62f388 | ||
|
|
040cd23e4a | ||
|
|
0324764a83 | ||
|
|
679e35fd46 | ||
|
|
49e0d54c76 | ||
|
|
7506852a99 | ||
|
|
bcbfb04992 | ||
|
|
5cd72f2431 | ||
|
|
eabca8439f | ||
|
|
ea1fffeebf | ||
|
|
6d58065909 | ||
|
|
47b0543461 | ||
|
|
8215c605b4 | ||
|
|
d7e949193f | ||
|
|
f64cf9187a | ||
|
|
b54d85d862 | ||
|
|
f419c18056 | ||
|
|
0ec17b6026 | ||
|
|
838978b869 | ||
|
|
8186253707 | ||
|
|
2316d843d7 | ||
|
|
9d58f11a60 | ||
|
|
7b18006193 | ||
|
|
9e48fc0c83 | ||
|
|
8e827e32ac | ||
|
|
c5c0e70e23 | ||
|
|
ec61f5e9d3 | ||
|
|
d57cced17b | ||
|
|
54a350be79 | ||
|
|
d6dbf0e0a6 | ||
|
|
0d887ad815 | ||
|
|
d4a5f8390e | ||
|
|
ab5d450d3c | ||
|
|
23c37fa506 | ||
|
|
63209c2646 | ||
|
|
f0dabd1446 | ||
|
|
552377c76f | ||
|
|
e7cd03325b | ||
|
|
decb3c178e | ||
|
|
f6d647d6c3 | ||
|
|
bf4a7b6ce8 | ||
|
|
8e2c85d14d | ||
|
|
1fbf8da79f | ||
|
|
a75309919e | ||
|
|
0ece395c24 | ||
|
|
b6391fe011 | ||
|
|
9a6af9c431 | ||
|
|
fa1cbb0746 | ||
|
|
68e1be3cf5 | ||
|
|
9abc4868d6 | ||
|
|
23991c99c3 | ||
|
|
cc0177be87 | ||
|
|
37b3e96b04 | ||
|
|
85214bdf81 | ||
|
|
fbbea9e6e2 | ||
|
|
7741483894 | ||
|
|
2f432e812c | ||
|
|
cad8970a57 | ||
|
|
4d7aed84ec | ||
|
|
00ed7c9424 | ||
|
|
d9bd75e683 | ||
|
|
93d8bafb24 | ||
|
|
c19a88fee9 | ||
|
|
0a331ea72e | ||
|
|
7d27b11190 | ||
|
|
eedfec015e | ||
|
|
ffc343a2bc | ||
|
|
e5aa605742 | ||
|
|
8b181ed818 | ||
|
|
f5a349558e | ||
|
|
b9b75ddcf5 | ||
|
|
a39720e94a | ||
|
|
2820feb02a | ||
|
|
8fc805d2e2 | ||
|
|
d54151e7c4 | ||
|
|
21a0a64648 | ||
|
|
20707fac4a | ||
|
|
e6ef0fc26c | ||
|
|
c157816017 | ||
|
|
eba5d19377 | ||
|
|
ad14d09a2b | ||
|
|
f3bcc651c7 | ||
|
|
e8602b81fa | ||
|
|
0f32109993 | ||
|
|
a17ccca615 | ||
|
|
7a1b238035 | ||
|
|
e1534a3200 | ||
|
|
9fec615dca | ||
|
|
ef02893f2f | ||
|
|
7cf4611d7c | ||
|
|
d028005aa6 | ||
|
|
1d23148e6d | ||
|
|
e416ee72ca | ||
|
|
2e902dee53 | ||
|
|
f6879da6c9 | ||
|
|
ae20a3ad3f | ||
|
|
c706926ee3 | ||
|
|
223e6c7590 | ||
|
|
825864032a | ||
|
|
06733ec21a | ||
|
|
9f7c619e4f | ||
|
|
3f5e3212fe | ||
|
|
20d05492d2 | ||
|
|
ae7ea33b75 | ||
|
|
263e984bf4 | ||
|
|
58f3abe3c6 | ||
|
|
d576416953 | ||
|
|
e3d1bb271f | ||
|
|
2df635693d | ||
|
|
40b4adc9cc | ||
|
|
0c971b4415 | ||
|
|
f2d37da4ca | ||
|
|
d5e5c3c220 | ||
|
|
15390bedd5 | ||
|
|
7f6a079aa4 | ||
|
|
2a25f58d40 | ||
|
|
2705109592 | ||
|
|
244ac5e024 | ||
|
|
f4da2e31d9 | ||
|
|
f650949573 | ||
|
|
76128051c0 | ||
|
|
5aa1106ba1 | ||
|
|
dccf3f49ef | ||
|
|
02ec8b7962 | ||
|
|
3f7ce939c8 | ||
|
|
b65cea1984 | ||
|
|
b422e71eed | ||
|
|
e9859ac1b1 | ||
|
|
b84f7e7c10 | ||
|
|
513842b23f | ||
|
|
985c80fbc6 | ||
|
|
35fe957020 | ||
|
|
0eebe6a5f4 | ||
|
|
760f16f568 | ||
|
|
241b9ddde9 | ||
|
|
3fcfb5cd49 | ||
|
|
e2384885f5 | ||
|
|
dd312c3cc5 | ||
|
|
80379927e8 | ||
|
|
676aae2755 | ||
|
|
f20e66e6f9 | ||
|
|
cd737ad7d3 | ||
|
|
df3aa84523 | ||
|
|
24a275ba25 | ||
|
|
aae438315f | ||
|
|
8b0d049b9f | ||
|
|
659bd99a67 | ||
|
|
c88166e055 | ||
|
|
099c0bcd34 | ||
|
|
d992e63075 | ||
|
|
c187f750fe | ||
|
|
bcbf6c1973 | ||
|
|
4bcbf70cae | ||
|
|
2d1854f354 | ||
|
|
a7c4a47723 | ||
|
|
61672ad3ff | ||
|
|
cea43099d2 | ||
|
|
6edf03c152 | ||
|
|
47c8cc24f4 | ||
|
|
64e46878e0 | ||
|
|
ea9b1e3503 | ||
|
|
2e9261cb26 | ||
|
|
69143d71f8 | ||
|
|
0c32fc5f2a | ||
|
|
af9cabe100 | ||
|
|
2ecb851926 | ||
|
|
2ffead76c1 | ||
|
|
5cc377751a | ||
|
|
ad8e9764e6 | ||
|
|
4ce426d8f6 | ||
|
|
c28e005087 | ||
|
|
22b751834f | ||
|
|
cce09b717e | ||
|
|
62dae3c6c6 | ||
|
|
97863e0b62 | ||
|
|
8a2f6bec33 | ||
|
|
e718378bdb | ||
|
|
d7d15a922a | ||
|
|
e74cb35aa4 | ||
|
|
da68651f61 | ||
|
|
be12136b8a | ||
|
|
6d3c21e369 | ||
|
|
1e96a1d6eb | ||
|
|
828bb64ebc | ||
|
|
6f00d32f7e | ||
|
|
f9e365828a | ||
|
|
90d463b925 | ||
|
|
22cdb5728b | ||
|
|
901152bd93 | ||
|
|
d9a5bca625 | ||
|
|
1676e9fe21 | ||
|
|
fad9d639bf | ||
|
|
efe6722bf8 | ||
|
|
a41f38547b | ||
|
|
87ee7868ea | ||
|
|
861bd1a96e | ||
|
|
6ac2b705dd | ||
|
|
fe4d6c68b5 | ||
|
|
5a7af5bb77 | ||
|
|
d9f90c84c0 | ||
|
|
4308407dc1 |
@@ -44,18 +44,26 @@ DerivePointerAlignment: false
|
|||||||
DisableFormat: false
|
DisableFormat: false
|
||||||
ExperimentalAutoDetectBinPacking: false
|
ExperimentalAutoDetectBinPacking: false
|
||||||
ForEachMacros: [ Q_FOREACH, BOOST_FOREACH ]
|
ForEachMacros: [ Q_FOREACH, BOOST_FOREACH ]
|
||||||
|
IncludeBlocks: Regroup
|
||||||
IncludeCategories:
|
IncludeCategories:
|
||||||
- Regex: '^<(BeastConfig)'
|
- Regex: '^<(test)/'
|
||||||
Priority: 0
|
Priority: 0
|
||||||
- Regex: '^<(ripple)/'
|
- Regex: '^<(xrpld)/'
|
||||||
|
Priority: 1
|
||||||
|
- Regex: '^<(xrpl)/'
|
||||||
Priority: 2
|
Priority: 2
|
||||||
- Regex: '^<(boost)/'
|
- Regex: '^<(boost)/'
|
||||||
Priority: 3
|
Priority: 3
|
||||||
- Regex: '.*'
|
- Regex: '^.*/'
|
||||||
Priority: 4
|
Priority: 4
|
||||||
|
- Regex: '^.*\.h'
|
||||||
|
Priority: 5
|
||||||
|
- Regex: '.*'
|
||||||
|
Priority: 6
|
||||||
IncludeIsMainRegex: '$'
|
IncludeIsMainRegex: '$'
|
||||||
IndentCaseLabels: true
|
IndentCaseLabels: true
|
||||||
IndentFunctionDeclarationAfterType: false
|
IndentFunctionDeclarationAfterType: false
|
||||||
|
IndentRequiresClause: true
|
||||||
IndentWidth: 4
|
IndentWidth: 4
|
||||||
IndentWrappedFunctionNames: false
|
IndentWrappedFunctionNames: false
|
||||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
@@ -71,6 +79,7 @@ PenaltyExcessCharacter: 1000000
|
|||||||
PenaltyReturnTypeOnItsOwnLine: 200
|
PenaltyReturnTypeOnItsOwnLine: 200
|
||||||
PointerAlignment: Left
|
PointerAlignment: Left
|
||||||
ReflowComments: true
|
ReflowComments: true
|
||||||
|
RequiresClausePosition: OwnLine
|
||||||
SortIncludes: true
|
SortIncludes: true
|
||||||
SpaceAfterCStyleCast: false
|
SpaceAfterCStyleCast: false
|
||||||
SpaceBeforeAssignmentOperators: true
|
SpaceBeforeAssignmentOperators: true
|
||||||
@@ -85,3 +94,4 @@ SpacesInSquareBrackets: false
|
|||||||
Standard: Cpp11
|
Standard: Cpp11
|
||||||
TabWidth: 8
|
TabWidth: 8
|
||||||
UseTab: Never
|
UseTab: Never
|
||||||
|
QualifierAlignment: Right
|
||||||
40
.codecov.yml
40
.codecov.yml
@@ -1,5 +1,37 @@
|
|||||||
|
|
||||||
codecov:
|
codecov:
|
||||||
ci:
|
require_ci_to_pass: true
|
||||||
- !appveyor
|
|
||||||
- travis
|
comment:
|
||||||
|
behavior: default
|
||||||
|
layout: reach,diff,flags,tree,reach
|
||||||
|
show_carryforward_flags: false
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
range: "70..85"
|
||||||
|
precision: 1
|
||||||
|
round: nearest
|
||||||
|
status:
|
||||||
|
project:
|
||||||
|
default:
|
||||||
|
target: 75%
|
||||||
|
threshold: 2%
|
||||||
|
patch:
|
||||||
|
default:
|
||||||
|
target: auto
|
||||||
|
threshold: 2%
|
||||||
|
changes: false
|
||||||
|
|
||||||
|
github_checks:
|
||||||
|
annotations: true
|
||||||
|
|
||||||
|
parsers:
|
||||||
|
cobertura:
|
||||||
|
partials_as_hits: true
|
||||||
|
handle_missing_conditions : true
|
||||||
|
|
||||||
|
slack_app: false
|
||||||
|
|
||||||
|
ignore:
|
||||||
|
- "src/test/"
|
||||||
|
- "include/xrpl/beast/test/"
|
||||||
|
- "include/xrpl/beast/unit_test/"
|
||||||
|
|||||||
@@ -2,3 +2,12 @@
|
|||||||
# To use it by default in git blame:
|
# To use it by default in git blame:
|
||||||
# git config blame.ignoreRevsFile .git-blame-ignore-revs
|
# git config blame.ignoreRevsFile .git-blame-ignore-revs
|
||||||
50760c693510894ca368e90369b0cc2dabfd07f3
|
50760c693510894ca368e90369b0cc2dabfd07f3
|
||||||
|
e2384885f5f630c8f0ffe4bf21a169b433a16858
|
||||||
|
241b9ddde9e11beb7480600fd5ed90e1ef109b21
|
||||||
|
760f16f56835663d9286bd29294d074de26a7ba6
|
||||||
|
0eebe6a5f4246fced516d52b83ec4e7f47373edd
|
||||||
|
2189cc950c0cebb89e4e2fa3b2d8817205bf7cef
|
||||||
|
b9d007813378ad0ff45660dc07285b823c7e9855
|
||||||
|
fe9a5365b8a52d4acc42eb27369247e6f238a4f9
|
||||||
|
9a93577314e6a8d4b4a8368cc9d2b15a5d8303e8
|
||||||
|
552377c76f55b403a1c876df873a23d780fcc81c
|
||||||
|
|||||||
8
.github/CODEOWNERS
vendored
Normal file
8
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# Allow anyone to review any change by default.
|
||||||
|
*
|
||||||
|
|
||||||
|
# Require the rpc-reviewers team to review changes to the rpc code.
|
||||||
|
include/xrpl/protocol/ @xrplf/rpc-reviewers
|
||||||
|
src/libxrpl/protocol/ @xrplf/rpc-reviewers
|
||||||
|
src/xrpld/rpc/ @xrplf/rpc-reviewers
|
||||||
|
src/xrpld/app/misc/ @xrplf/rpc-reviewers
|
||||||
7
.github/actions/build/action.yml
vendored
7
.github/actions/build/action.yml
vendored
@@ -6,6 +6,8 @@ inputs:
|
|||||||
required: true
|
required: true
|
||||||
cmake-args:
|
cmake-args:
|
||||||
default: null
|
default: null
|
||||||
|
cmake-target:
|
||||||
|
default: all
|
||||||
# An implicit input is the environment variable `build_dir`.
|
# An implicit input is the environment variable `build_dir`.
|
||||||
runs:
|
runs:
|
||||||
using: composite
|
using: composite
|
||||||
@@ -18,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
|
||||||
@@ -26,4 +30,5 @@ runs:
|
|||||||
cmake \
|
cmake \
|
||||||
--build ${build_dir} \
|
--build ${build_dir} \
|
||||||
--config ${{ inputs.configuration }} \
|
--config ${{ inputs.configuration }} \
|
||||||
--parallel ${NUM_PROCESSORS:-$(nproc)}
|
--parallel ${NUM_PROCESSORS:-$(nproc)} \
|
||||||
|
--target ${{ inputs.cmake-target }}
|
||||||
|
|||||||
40
.github/actions/dependencies/action.yml
vendored
40
.github/actions/dependencies/action.yml
vendored
@@ -6,14 +6,40 @@ inputs:
|
|||||||
runs:
|
runs:
|
||||||
using: composite
|
using: composite
|
||||||
steps:
|
steps:
|
||||||
- name: unlock Conan
|
|
||||||
shell: bash
|
|
||||||
run: conan remove --locks
|
|
||||||
- name: export custom recipes
|
- name: export custom recipes
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
conan export external/snappy snappy/1.1.10@
|
conan export --version 1.1.10 external/snappy
|
||||||
conan export external/soci soci/4.0.3@
|
conan export --version 9.7.3 external/rocksdb
|
||||||
|
conan export --version 4.0.3 external/soci
|
||||||
|
conan export --version 2.0.8 external/nudb
|
||||||
|
- 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: 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
|
||||||
|
# Print the list of dependencies that would need to be built locally.
|
||||||
|
# A non-empty list means we have "failed" to cache binaries remotely.
|
||||||
|
run: |
|
||||||
|
echo missing=$(conan info . --build missing --settings build_type=${{ inputs.configuration }} --json 2>/dev/null | grep '^\[') | tee ${GITHUB_OUTPUT}
|
||||||
- name: install dependencies
|
- name: install dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
@@ -22,5 +48,7 @@ runs:
|
|||||||
conan install \
|
conan install \
|
||||||
--output-folder . \
|
--output-folder . \
|
||||||
--build missing \
|
--build missing \
|
||||||
--settings build_type=${{ inputs.configuration }} \
|
--options:host "&:tests=True" \
|
||||||
|
--options:host "&:xrpld=True" \
|
||||||
|
--settings:all build_type=${{ inputs.configuration }} \
|
||||||
..
|
..
|
||||||
|
|||||||
13
.github/pull_request_template.md
vendored
13
.github/pull_request_template.md
vendored
@@ -1,6 +1,12 @@
|
|||||||
<!--
|
<!--
|
||||||
This PR template helps you to write a good pull request description.
|
This PR template helps you to write a good pull request description.
|
||||||
Please feel free to include additional useful information even beyond what is requested below.
|
Please feel free to include additional useful information even beyond what is requested below.
|
||||||
|
|
||||||
|
If your branch is on a personal fork and has a name that allows it to
|
||||||
|
run CI build/test jobs (e.g. "ci/foo"), remember to rename it BEFORE
|
||||||
|
opening the PR. This avoids unnecessary redundant test runs. Renaming
|
||||||
|
the branch after opening the PR will close the PR.
|
||||||
|
https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/renaming-a-branch
|
||||||
-->
|
-->
|
||||||
|
|
||||||
## High Level Overview of Change
|
## High Level Overview of Change
|
||||||
@@ -33,6 +39,7 @@ Please check [x] relevant options, delete irrelevant ones.
|
|||||||
- [ ] New feature (non-breaking change which adds functionality)
|
- [ ] New feature (non-breaking change which adds functionality)
|
||||||
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
||||||
- [ ] Refactor (non-breaking change that only restructures code)
|
- [ ] Refactor (non-breaking change that only restructures code)
|
||||||
|
- [ ] Performance (increase or change in throughput and/or latency)
|
||||||
- [ ] Tests (you added tests for code that already exists, or your new feature included in this PR)
|
- [ ] Tests (you added tests for code that already exists, or your new feature included in this PR)
|
||||||
- [ ] Documentation update
|
- [ ] Documentation update
|
||||||
- [ ] Chore (no impact to binary, e.g. `.gitignore`, formatting, dropping support for older tooling)
|
- [ ] Chore (no impact to binary, e.g. `.gitignore`, formatting, dropping support for older tooling)
|
||||||
@@ -58,6 +65,12 @@ Please check [x] relevant options, delete irrelevant ones.
|
|||||||
## Before / After
|
## Before / After
|
||||||
If relevant, use this section for an English description of the change at a technical level.
|
If relevant, use this section for an English description of the change at a technical level.
|
||||||
If this change affects an API, examples should be included here.
|
If this change affects an API, examples should be included here.
|
||||||
|
|
||||||
|
For performance-impacting changes, please provide these details:
|
||||||
|
1. Is this a new feature, bug fix, or improvement to existing functionality?
|
||||||
|
2. What behavior/functionality does the change impact?
|
||||||
|
3. In what processing can the impact be measured? Be as specific as possible - e.g. RPC client call, payment transaction that involves LOB, AMM, caching, DB operations, etc.
|
||||||
|
4. Does this change affect concurrent processing - e.g. does it involve acquiring locks, multi-threaded processing, or async processing?
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
|
|||||||
102
.github/workflows/clang-format.yml
vendored
102
.github/workflows/clang-format.yml
vendored
@@ -1,61 +1,55 @@
|
|||||||
name: clang-format
|
name: clang-format
|
||||||
|
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, reopened, synchronize, ready_for_review]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check:
|
check:
|
||||||
runs-on: ubuntu-20.04
|
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
|
||||||
env:
|
runs-on: ubuntu-24.04
|
||||||
CLANG_VERSION: 10
|
container: ghcr.io/xrplf/ci/tools-rippled-clang-format
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Install clang-format
|
- name: Format first-party sources
|
||||||
run: |
|
run: |
|
||||||
codename=$( lsb_release --codename --short )
|
clang-format --version
|
||||||
sudo tee /etc/apt/sources.list.d/llvm.list >/dev/null <<EOF
|
find include src tests -type f \( -name '*.cpp' -o -name '*.hpp' -o -name '*.h' -o -name '*.ipp' \) -exec clang-format -i {} +
|
||||||
deb http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}-${CLANG_VERSION} main
|
- name: Check for differences
|
||||||
deb-src http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}-${CLANG_VERSION} main
|
id: assert
|
||||||
EOF
|
shell: bash
|
||||||
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add
|
run: |
|
||||||
sudo apt-get update
|
set -o pipefail
|
||||||
sudo apt-get install clang-format-${CLANG_VERSION}
|
git diff --exit-code | tee "clang-format.patch"
|
||||||
- name: Format src/ripple
|
- name: Upload patch
|
||||||
run: find src/ripple -type f \( -name '*.cpp' -o -name '*.h' -o -name '*.ipp' \) -print0 | xargs -0 clang-format-${CLANG_VERSION} -i
|
if: failure() && steps.assert.outcome == 'failure'
|
||||||
- name: Format src/test
|
uses: actions/upload-artifact@v4
|
||||||
run: find src/test -type f \( -name '*.cpp' -o -name '*.h' -o -name '*.ipp' \) -print0 | xargs -0 clang-format-${CLANG_VERSION} -i
|
continue-on-error: true
|
||||||
- name: Check for differences
|
with:
|
||||||
id: assert
|
name: clang-format.patch
|
||||||
run: |
|
if-no-files-found: ignore
|
||||||
set -o pipefail
|
path: clang-format.patch
|
||||||
git diff --exit-code | tee "clang-format.patch"
|
- name: What happened?
|
||||||
- name: Upload patch
|
if: failure() && steps.assert.outcome == 'failure'
|
||||||
if: failure() && steps.assert.outcome == 'failure'
|
env:
|
||||||
uses: actions/upload-artifact@v2
|
PREAMBLE: |
|
||||||
continue-on-error: true
|
If you are reading this, you are looking at a failed Github Actions
|
||||||
with:
|
job. That means you pushed one or more files that did not conform
|
||||||
name: clang-format.patch
|
to the formatting specified in .clang-format. That may be because
|
||||||
if-no-files-found: ignore
|
you neglected to run 'git clang-format' or 'clang-format' before
|
||||||
path: clang-format.patch
|
committing, or that your version of clang-format has an
|
||||||
- name: What happened?
|
incompatibility with the one on this
|
||||||
if: failure() && steps.assert.outcome == 'failure'
|
machine, which is:
|
||||||
env:
|
SUGGESTION: |
|
||||||
PREAMBLE: |
|
|
||||||
If you are reading this, you are looking at a failed Github Actions
|
|
||||||
job. That means you pushed one or more files that did not conform
|
|
||||||
to the formatting specified in .clang-format. That may be because
|
|
||||||
you neglected to run 'git clang-format' or 'clang-format' before
|
|
||||||
committing, or that your version of clang-format has an
|
|
||||||
incompatibility with the one on this
|
|
||||||
machine, which is:
|
|
||||||
SUGGESTION: |
|
|
||||||
|
|
||||||
To fix it, you can do one of two things:
|
To fix it, you can do one of two things:
|
||||||
1. Download and apply the patch generated as an artifact of this
|
1. Download and apply the patch generated as an artifact of this
|
||||||
job to your repo, commit, and push.
|
job to your repo, commit, and push.
|
||||||
2. Run 'git-clang-format --extensions c,cpp,h,cxx,ipp develop'
|
2. Run 'git-clang-format --extensions cpp,h,hpp,ipp develop'
|
||||||
in your repo, commit, and push.
|
in your repo, commit, and push.
|
||||||
run: |
|
run: |
|
||||||
echo "${PREAMBLE}"
|
echo "${PREAMBLE}"
|
||||||
clang-format-${CLANG_VERSION} --version
|
clang-format --version
|
||||||
echo "${SUGGESTION}"
|
echo "${SUGGESTION}"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
8
.github/workflows/doxygen.yml
vendored
8
.github/workflows/doxygen.yml
vendored
@@ -4,20 +4,20 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- develop
|
- develop
|
||||||
|
- doxygen
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
job:
|
documentation:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
container:
|
container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
|
||||||
image: docker://rippleci/rippled-ci-builder:2944b78d22db
|
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: check environment
|
- name: check environment
|
||||||
run: |
|
run: |
|
||||||
echo ${PATH} | tr ':' '\n'
|
echo ${PATH} | tr ':' '\n'
|
||||||
|
|||||||
78
.github/workflows/levelization.yml
vendored
78
.github/workflows/levelization.yml
vendored
@@ -1,49 +1,53 @@
|
|||||||
name: levelization
|
name: levelization
|
||||||
|
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, reopened, synchronize, ready_for_review]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check:
|
check:
|
||||||
|
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
CLANG_VERSION: 10
|
CLANG_VERSION: 10
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Check levelization
|
- name: Check levelization
|
||||||
run: Builds/levelization/levelization.sh
|
run: Builds/levelization/levelization.sh
|
||||||
- name: Check for differences
|
- name: Check for differences
|
||||||
id: assert
|
id: assert
|
||||||
run: |
|
run: |
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
git diff --exit-code | tee "levelization.patch"
|
git diff --exit-code | tee "levelization.patch"
|
||||||
- name: Upload patch
|
- name: Upload patch
|
||||||
if: failure() && steps.assert.outcome == 'failure'
|
if: failure() && steps.assert.outcome == 'failure'
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v4
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
with:
|
with:
|
||||||
name: levelization.patch
|
name: levelization.patch
|
||||||
if-no-files-found: ignore
|
if-no-files-found: ignore
|
||||||
path: levelization.patch
|
path: levelization.patch
|
||||||
- name: What happened?
|
- name: What happened?
|
||||||
if: failure() && steps.assert.outcome == 'failure'
|
if: failure() && steps.assert.outcome == 'failure'
|
||||||
env:
|
env:
|
||||||
MESSAGE: |
|
MESSAGE: |
|
||||||
If you are reading this, you are looking at a failed Github
|
If you are reading this, you are looking at a failed Github
|
||||||
Actions job. That means you changed the dependency relationships
|
Actions job. That means you changed the dependency relationships
|
||||||
between the modules in rippled. That may be an improvement or a
|
between the modules in rippled. That may be an improvement or a
|
||||||
regression. This check doesn't judge.
|
regression. This check doesn't judge.
|
||||||
|
|
||||||
A rule of thumb, though, is that if your changes caused
|
A rule of thumb, though, is that if your changes caused
|
||||||
something to be removed from loops.txt, that's probably an
|
something to be removed from loops.txt, that's probably an
|
||||||
improvement. If something was added, it's probably a regression.
|
improvement. If something was added, it's probably a regression.
|
||||||
|
|
||||||
To fix it, you can do one of two things:
|
To fix it, you can do one of two things:
|
||||||
1. Download and apply the patch generated as an artifact of this
|
1. Download and apply the patch generated as an artifact of this
|
||||||
job to your repo, commit, and push.
|
job to your repo, commit, and push.
|
||||||
2. Run './Builds/levelization/levelization.sh' in your repo,
|
2. Run './Builds/levelization/levelization.sh' in your repo,
|
||||||
commit, and push.
|
commit, and push.
|
||||||
|
|
||||||
See Builds/levelization/README.md for more info.
|
See Builds/levelization/README.md for more info.
|
||||||
run: |
|
run: |
|
||||||
echo "${MESSAGE}"
|
echo "${MESSAGE}"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
91
.github/workflows/libxrpl.yml
vendored
Normal file
91
.github/workflows/libxrpl.yml
vendored
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
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 }}
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'src/libxrpl/protocol/BuildInfo.cpp'
|
||||||
|
- '.github/workflows/libxrpl.yml'
|
||||||
|
types: [opened, reopened, synchronize, ready_for_review]
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
|
||||||
|
name: Publish libXRPL
|
||||||
|
outputs:
|
||||||
|
outcome: ${{ steps.upload.outputs.outcome }}
|
||||||
|
version: ${{ steps.version.outputs.version }}
|
||||||
|
channel: ${{ steps.channel.outputs.channel }}
|
||||||
|
runs-on: [self-hosted, heavy]
|
||||||
|
container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
|
||||||
|
steps:
|
||||||
|
- name: Wait for essential checks to succeed
|
||||||
|
uses: lewagon/wait-on-check-action@v1.3.4
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
||||||
|
running-workflow-name: wait-for-check-regexp
|
||||||
|
check-regexp: '(dependencies|test).*linux.*' # Ignore windows and mac tests but make sure linux passes
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
wait-interval: 10
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Generate channel
|
||||||
|
id: channel
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo channel="clio/pr_${{ github.event.pull_request.number }}" | tee ${GITHUB_OUTPUT}
|
||||||
|
- name: Export new package
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
conan export . ${{ steps.channel.outputs.channel }}
|
||||||
|
- name: Add Ripple Conan remote
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
conan remote list
|
||||||
|
conan remote remove ripple || 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
|
||||||
|
- 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
|
||||||
|
id: remote
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
# `conan user` implicitly uses the environment variables CONAN_LOGIN_USERNAME_<REMOTE> and CONAN_PASSWORD_<REMOTE>.
|
||||||
|
# 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 success || echo failure) | tee ${GITHUB_OUTPUT}
|
||||||
|
- name: Upload new package
|
||||||
|
id: upload
|
||||||
|
if: (steps.remote.outputs.outcome == 'success')
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "conan upload version ${{ steps.version.outputs.version }} on channel ${{ steps.channel.outputs.channel }}"
|
||||||
|
echo outcome=$(conan upload xrpl/${{ steps.version.outputs.version }}@${{ steps.channel.outputs.channel }} --remote ripple --confirm >&2 \
|
||||||
|
&& echo success || echo failure) | tee ${GITHUB_OUTPUT}
|
||||||
|
notify_clio:
|
||||||
|
name: Notify Clio
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: publish
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.CLIO_NOTIFY_TOKEN }}
|
||||||
|
steps:
|
||||||
|
- name: Notify Clio about new version
|
||||||
|
if: (needs.publish.outputs.outcome == 'success')
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" \
|
||||||
|
/repos/xrplf/clio/dispatches -f "event_type=check_libxrpl" \
|
||||||
|
-F "client_payload[version]=${{ needs.publish.outputs.version }}@${{ needs.publish.outputs.channel }}" \
|
||||||
|
-F "client_payload[pr]=${{ github.event.pull_request.number }}"
|
||||||
90
.github/workflows/macos.yml
vendored
90
.github/workflows/macos.yml
vendored
@@ -1,12 +1,37 @@
|
|||||||
name: macos
|
name: macos
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, reopened, synchronize, ready_for_review]
|
||||||
|
push:
|
||||||
|
# If the branches list is ever changed, be sure to change it on all
|
||||||
|
# build/test jobs (nix, macos, windows, instrumentation)
|
||||||
|
branches:
|
||||||
|
# Always build the package branches
|
||||||
|
- develop
|
||||||
|
- release
|
||||||
|
- master
|
||||||
|
# Branches that opt-in to running
|
||||||
|
- 'ci/**'
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
# 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_GLOBAL_CONF: |
|
||||||
|
core.download:parallel={{os.cpu_count()}}
|
||||||
|
core.upload:parallel={{os.cpu_count()}}
|
||||||
|
tools.build:jobs={{ (os.cpu_count() * 4/5) | int }}
|
||||||
|
tools.build:verbosity=verbose
|
||||||
|
tools.compilation:verbosity=verbose
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
test:
|
test:
|
||||||
|
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
platform:
|
platform:
|
||||||
@@ -22,22 +47,67 @@ jobs:
|
|||||||
NUM_PROCESSORS: 12
|
NUM_PROCESSORS: 12
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
|
- name: install Conan
|
||||||
|
run: |
|
||||||
|
brew install conan
|
||||||
- name: install Ninja
|
- name: install Ninja
|
||||||
if: matrix.generator == 'Ninja'
|
if: matrix.generator == 'Ninja'
|
||||||
run: brew install ninja
|
run: brew install ninja
|
||||||
|
- name: install python
|
||||||
|
run: |
|
||||||
|
if which python > /dev/null 2>&1; then
|
||||||
|
echo "Python executable exists"
|
||||||
|
else
|
||||||
|
brew install python@3.13
|
||||||
|
ln -s /opt/homebrew/bin/python3 /opt/homebrew/bin/python
|
||||||
|
fi
|
||||||
|
- name: install cmake
|
||||||
|
run: |
|
||||||
|
if which cmake > /dev/null 2>&1; then
|
||||||
|
echo "cmake executable exists"
|
||||||
|
else
|
||||||
|
brew install cmake
|
||||||
|
fi
|
||||||
|
- name: install nproc
|
||||||
|
run: |
|
||||||
|
brew install coreutils
|
||||||
- name: check environment
|
- name: check environment
|
||||||
run: |
|
run: |
|
||||||
|
env | sort
|
||||||
echo ${PATH} | tr ':' '\n'
|
echo ${PATH} | tr ':' '\n'
|
||||||
python --version
|
python --version
|
||||||
conan --version
|
conan --version
|
||||||
cmake --version
|
cmake --version
|
||||||
env | sort
|
nproc --version
|
||||||
|
echo -n "nproc returns: "
|
||||||
|
nproc
|
||||||
|
system_profiler SPHardwareDataType
|
||||||
|
sysctl -n hw.logicalcpu
|
||||||
|
clang --version
|
||||||
- name: configure Conan
|
- name: configure Conan
|
||||||
run : |
|
run : |
|
||||||
conan profile get env.CXXFLAGS default || true
|
echo "${CONAN_GLOBAL_CONF}" > global.conf
|
||||||
conan profile update 'conf.tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]' default
|
conan config install conan/profiles/ -tf $(conan config home)/profiles/
|
||||||
- name: dependencies
|
conan profile show
|
||||||
|
- name: export custom recipes
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
conan export --version 1.1.10 external/snappy
|
||||||
|
conan export --version 9.7.3 external/rocksdb
|
||||||
|
conan export --version 4.0.3 external/soci
|
||||||
|
conan export --version 2.0.8 external/nudb
|
||||||
|
- 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
|
uses: ./.github/actions/dependencies
|
||||||
with:
|
with:
|
||||||
configuration: ${{ matrix.configuration }}
|
configuration: ${{ matrix.configuration }}
|
||||||
@@ -46,6 +116,12 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
generator: ${{ matrix.generator }}
|
generator: ${{ matrix.generator }}
|
||||||
configuration: ${{ matrix.configuration }}
|
configuration: ${{ matrix.configuration }}
|
||||||
|
cmake-args: "-Dassert=TRUE -Dwerr=TRUE ${{ matrix.cmake-args }}"
|
||||||
- name: test
|
- name: test
|
||||||
run: |
|
run: |
|
||||||
${build_dir}/rippled --unittest
|
n=$(nproc)
|
||||||
|
echo "Using $n test jobs"
|
||||||
|
|
||||||
|
cd ${build_dir}
|
||||||
|
./rippled --unittest --unittest-jobs $n
|
||||||
|
ctest -j $n --output-on-failure
|
||||||
|
|||||||
60
.github/workflows/missing-commits.yml
vendored
Normal file
60
.github/workflows/missing-commits.yml
vendored
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
name: missing-commits
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
# Only check that the branches are up to date when updating the
|
||||||
|
# relevant branches.
|
||||||
|
- develop
|
||||||
|
- release
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
up_to_date:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Check for missing commits
|
||||||
|
id: commits
|
||||||
|
env:
|
||||||
|
SUGGESTION: |
|
||||||
|
|
||||||
|
If you are reading this, then the commits indicated above are
|
||||||
|
missing from "develop" and/or "release". Do a reverse-merge
|
||||||
|
as soon as possible. See CONTRIBUTING.md for instructions.
|
||||||
|
run: |
|
||||||
|
set -o pipefail
|
||||||
|
# Branches ordered by how "canonical" they are. Every commit in
|
||||||
|
# one branch should be in all the branches behind it
|
||||||
|
order=( master release develop )
|
||||||
|
branches=()
|
||||||
|
for branch in "${order[@]}"
|
||||||
|
do
|
||||||
|
# Check that the branches exist so that this job will work on
|
||||||
|
# forked repos, which don't necessarily have master and
|
||||||
|
# release branches.
|
||||||
|
if git ls-remote --exit-code --heads origin \
|
||||||
|
refs/heads/${branch} > /dev/null
|
||||||
|
then
|
||||||
|
branches+=( origin/${branch} )
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
prior=()
|
||||||
|
for branch in "${branches[@]}"
|
||||||
|
do
|
||||||
|
if [[ ${#prior[@]} -ne 0 ]]
|
||||||
|
then
|
||||||
|
echo "Checking ${prior[@]} for commits missing from ${branch}"
|
||||||
|
git log --oneline --no-merges "${prior[@]}" \
|
||||||
|
^$branch | tee -a "missing-commits.txt"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
prior+=( "${branch}" )
|
||||||
|
done
|
||||||
|
if [[ $( cat missing-commits.txt | wc -l ) -ne 0 ]]
|
||||||
|
then
|
||||||
|
echo "${SUGGESTION}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
367
.github/workflows/nix.yml
vendored
367
.github/workflows/nix.yml
vendored
@@ -1,12 +1,37 @@
|
|||||||
name: nix
|
name: nix
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, reopened, synchronize, ready_for_review]
|
||||||
|
push:
|
||||||
|
# If the branches list is ever changed, be sure to change it on all
|
||||||
|
# build/test jobs (nix, macos, windows)
|
||||||
|
branches:
|
||||||
|
# Always build the package branches
|
||||||
|
- develop
|
||||||
|
- release
|
||||||
|
- master
|
||||||
|
# Branches that opt-in to running
|
||||||
|
- "ci/**"
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
# This workflow has two job matrixes.
|
# This part of Conan configuration is specific to this workflow only; we do not want
|
||||||
# They can be considered phases because the second matrix ("test")
|
# to pollute conan/profiles directory with settings which might not work for others
|
||||||
# depends on the first ("dependencies").
|
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_GLOBAL_CONF: |
|
||||||
|
core.download:parallel={{ os.cpu_count() }}
|
||||||
|
core.upload:parallel={{ os.cpu_count() }}
|
||||||
|
tools.build:jobs={{ (os.cpu_count() * 4/5) | int }}
|
||||||
|
tools.build:verbosity=verbose
|
||||||
|
tools.compilation:verbosity=verbose
|
||||||
|
|
||||||
|
# This workflow has multiple job matrixes.
|
||||||
|
# They can be considered phases because most of the matrices ("test",
|
||||||
|
# "coverage", "conan", ) depend on the first ("dependencies").
|
||||||
#
|
#
|
||||||
# The first phase has a job in the matrix for each combination of
|
# The first phase has a job in the matrix for each combination of
|
||||||
# variables that affects dependency ABI:
|
# variables that affects dependency ABI:
|
||||||
@@ -19,13 +44,16 @@ concurrency:
|
|||||||
# to hold the binaries if they are built locally.
|
# to hold the binaries if they are built locally.
|
||||||
# We must use the "{upload,download}-artifact" actions instead.
|
# We must use the "{upload,download}-artifact" actions instead.
|
||||||
#
|
#
|
||||||
# The second phase has a job in the matrix for each test configuration.
|
# The remaining phases have a job in the matrix for each test
|
||||||
# It installs dependency binaries from the cache, whichever was used,
|
# configuration. They install dependency binaries from the cache,
|
||||||
# and builds and tests rippled.
|
# whichever was used, and build and test rippled.
|
||||||
|
#
|
||||||
|
# "instrumentation" is independent, but is included here because it also
|
||||||
|
# builds on linux in the same "on:" conditions.
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
|
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -39,75 +67,47 @@ jobs:
|
|||||||
- Release
|
- Release
|
||||||
include:
|
include:
|
||||||
- compiler: gcc
|
- compiler: gcc
|
||||||
profile:
|
compiler_version: 12
|
||||||
version: 11
|
distro: ubuntu
|
||||||
cc: /usr/bin/gcc
|
codename: jammy
|
||||||
cxx: /usr/bin/g++
|
|
||||||
- compiler: clang
|
- compiler: clang
|
||||||
profile:
|
compiler_version: 16
|
||||||
version: 14
|
distro: debian
|
||||||
cc: /usr/bin/clang-14
|
codename: bookworm
|
||||||
cxx: /usr/bin/clang++-14
|
|
||||||
runs-on: [self-hosted, heavy]
|
runs-on: [self-hosted, heavy]
|
||||||
container: thejohnfreeman/rippled-build-ubuntu:12e19cd9034b
|
container: ghcr.io/xrplf/ci/${{ matrix.distro }}-${{ matrix.codename }}:${{ matrix.compiler }}-${{ matrix.compiler_version }}
|
||||||
env:
|
env:
|
||||||
build_dir: .build
|
build_dir: .build
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
- name: check environment
|
- name: check environment
|
||||||
run: |
|
run: |
|
||||||
echo ${PATH} | tr ':' '\n'
|
echo ${PATH} | tr ':' '\n'
|
||||||
|
lsb_release -a || true
|
||||||
|
${{ matrix.compiler }}-${{ matrix.compiler_version }} --version
|
||||||
conan --version
|
conan --version
|
||||||
cmake --version
|
cmake --version
|
||||||
env | sort
|
env | sort
|
||||||
- name: configure Conan
|
- name: configure Conan
|
||||||
env:
|
|
||||||
CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
|
|
||||||
run: |
|
run: |
|
||||||
conan profile new default --detect
|
echo "${CONAN_GLOBAL_CONF}" >> ${CONAN_HOME}/global.conf
|
||||||
conan profile update settings.compiler.cppstd=20 default
|
conan profile show
|
||||||
conan profile update settings.compiler=${{ matrix.compiler }} default
|
|
||||||
conan profile update settings.compiler.version=${{ matrix.profile.version }} default
|
|
||||||
conan profile update settings.compiler.libcxx=libstdc++11 default
|
|
||||||
conan profile update env.CC=${{ matrix.profile.cc }} default
|
|
||||||
conan profile update env.CXX=${{ matrix.profile.cxx }} default
|
|
||||||
conan profile update conf.tools.build:compiler_executables='{"c": "${{ matrix.profile.cc }}", "cpp": "${{ matrix.profile.cxx }}"}' default
|
|
||||||
# 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
|
|
||||||
- name: try to authenticate to ripple Conan remote
|
|
||||||
id: remote
|
|
||||||
run: |
|
|
||||||
echo outcome=$(conan user --remote ripple ${{ secrets.CONAN_USERNAME }} --password ${{ secrets.CONAN_TOKEN }} >&2 && echo success || echo failure) | tee ${GITHUB_OUTPUT}
|
|
||||||
- name: archive profile
|
- name: archive profile
|
||||||
# Create this archive before dependencies are added to the local cache.
|
# Create this archive before dependencies are added to the local cache.
|
||||||
run: tar -czf conan.tar -C ~/.conan .
|
run: tar -czf conan.tar.gz -C ${CONAN_HOME} .
|
||||||
- name: list missing binaries
|
|
||||||
id: binaries
|
|
||||||
# Print the list of dependencies that would need to be built locally.
|
|
||||||
# A non-empty list means we have "failed" to cache binaries remotely.
|
|
||||||
run: |
|
|
||||||
echo missing=$(conan info . --build missing --settings build_type=${{ matrix.configuration }} --json 2>/dev/null | grep '^\[') | tee ${GITHUB_OUTPUT}
|
|
||||||
- name: build dependencies
|
- name: build dependencies
|
||||||
if: (steps.binaries.outputs.missing != '[]')
|
|
||||||
uses: ./.github/actions/dependencies
|
uses: ./.github/actions/dependencies
|
||||||
|
|
||||||
with:
|
with:
|
||||||
configuration: ${{ matrix.configuration }}
|
configuration: ${{ matrix.configuration }}
|
||||||
- name: upload dependencies to remote
|
|
||||||
if: (steps.binaries.outputs.missing != '[]') && (steps.remote.outputs.outcome == 'success')
|
|
||||||
run: conan upload --remote ripple '*' --all --parallel --confirm
|
|
||||||
- name: recreate archive with dependencies
|
|
||||||
if: (steps.binaries.outputs.missing != '[]') && (steps.remote.outputs.outcome == 'failure')
|
|
||||||
run: tar -czf conan.tar -C ~/.conan .
|
|
||||||
- name: upload archive
|
- name: upload archive
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.platform }}-${{ matrix.compiler }}-${{ matrix.configuration }}
|
name: ${{ matrix.platform }}-${{ matrix.compiler }}-${{ matrix.configuration }}
|
||||||
path: conan.tar
|
path: conan.tar.gz
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
|
|
||||||
test:
|
test:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@@ -120,32 +120,40 @@ jobs:
|
|||||||
configuration:
|
configuration:
|
||||||
- Debug
|
- Debug
|
||||||
- Release
|
- Release
|
||||||
|
include:
|
||||||
|
- compiler: gcc
|
||||||
|
compiler_version: 12
|
||||||
|
distro: ubuntu
|
||||||
|
codename: jammy
|
||||||
|
- compiler: clang
|
||||||
|
compiler_version: 16
|
||||||
|
distro: debian
|
||||||
|
codename: bookworm
|
||||||
cmake-args:
|
cmake-args:
|
||||||
-
|
-
|
||||||
- "-Dunity=ON"
|
- "-Dunity=ON"
|
||||||
needs: dependencies
|
needs: dependencies
|
||||||
runs-on: [self-hosted, heavy]
|
runs-on: [self-hosted, heavy]
|
||||||
container: thejohnfreeman/rippled-build-ubuntu:12e19cd9034b
|
container: ghcr.io/xrplf/ci/${{ matrix.distro }}-${{ matrix.codename }}:${{ matrix.compiler }}-${{ matrix.compiler_version }}
|
||||||
env:
|
env:
|
||||||
build_dir: .build
|
build_dir: .build
|
||||||
steps:
|
steps:
|
||||||
- name: download cache
|
- name: download cache
|
||||||
uses: actions/download-artifact@v3
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.platform }}-${{ matrix.compiler }}-${{ matrix.configuration }}
|
name: ${{ matrix.platform }}-${{ matrix.compiler }}-${{ matrix.configuration }}
|
||||||
- name: extract cache
|
- name: extract cache
|
||||||
run: |
|
run: |
|
||||||
mkdir -p ~/.conan
|
mkdir -p ${CONAN_HOME}
|
||||||
tar -xzf conan.tar -C ~/.conan
|
tar -xzf conan.tar.gz -C ${CONAN_HOME}
|
||||||
- name: check environment
|
- name: check environment
|
||||||
run: |
|
run: |
|
||||||
|
env | sort
|
||||||
echo ${PATH} | tr ':' '\n'
|
echo ${PATH} | tr ':' '\n'
|
||||||
conan --version
|
conan --version
|
||||||
cmake --version
|
cmake --version
|
||||||
env | sort
|
|
||||||
ls ~/.conan
|
|
||||||
- name: checkout
|
- name: checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
- name: dependencies
|
- name: dependencies
|
||||||
uses: ./.github/actions/dependencies
|
uses: ./.github/actions/dependencies
|
||||||
with:
|
with:
|
||||||
@@ -155,7 +163,244 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
generator: Ninja
|
generator: Ninja
|
||||||
configuration: ${{ matrix.configuration }}
|
configuration: ${{ matrix.configuration }}
|
||||||
cmake-args: ${{ matrix.cmake-args }}
|
cmake-args: "-Dassert=TRUE -Dwerr=TRUE ${{ matrix.cmake-args }}"
|
||||||
- name: test
|
- name: test
|
||||||
run: |
|
run: |
|
||||||
${build_dir}/rippled --unittest --unittest-jobs $(nproc)
|
cd ${build_dir}
|
||||||
|
./rippled --unittest --unittest-jobs $(nproc)
|
||||||
|
ctest -j $(nproc) --output-on-failure
|
||||||
|
|
||||||
|
reference-fee-test:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
platform:
|
||||||
|
- linux
|
||||||
|
compiler:
|
||||||
|
- gcc
|
||||||
|
configuration:
|
||||||
|
- Debug
|
||||||
|
cmake-args:
|
||||||
|
- "-DUNIT_TEST_REFERENCE_FEE=200"
|
||||||
|
- "-DUNIT_TEST_REFERENCE_FEE=1000"
|
||||||
|
needs: dependencies
|
||||||
|
runs-on: [self-hosted, heavy]
|
||||||
|
container: ghcr.io/xrplf/ci/ubuntu-jammy:gcc-12
|
||||||
|
env:
|
||||||
|
build_dir: .build
|
||||||
|
steps:
|
||||||
|
- name: download cache
|
||||||
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
|
||||||
|
with:
|
||||||
|
name: ${{ matrix.platform }}-${{ matrix.compiler }}-${{ matrix.configuration }}
|
||||||
|
- name: extract cache
|
||||||
|
run: |
|
||||||
|
mkdir -p ${CONAN_HOME}
|
||||||
|
tar -xzf conan.tar.gz -C ${CONAN_HOME}
|
||||||
|
- name: check environment
|
||||||
|
run: |
|
||||||
|
env | sort
|
||||||
|
echo ${PATH} | tr ':' '\n'
|
||||||
|
conan --version
|
||||||
|
cmake --version
|
||||||
|
- name: checkout
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
|
- name: dependencies
|
||||||
|
uses: ./.github/actions/dependencies
|
||||||
|
with:
|
||||||
|
configuration: ${{ matrix.configuration }}
|
||||||
|
- name: build
|
||||||
|
uses: ./.github/actions/build
|
||||||
|
with:
|
||||||
|
generator: Ninja
|
||||||
|
configuration: ${{ matrix.configuration }}
|
||||||
|
cmake-args: "-Dassert=TRUE -Dwerr=TRUE ${{ matrix.cmake-args }}"
|
||||||
|
- name: test
|
||||||
|
run: |
|
||||||
|
cd ${build_dir}
|
||||||
|
./rippled --unittest --unittest-jobs $(nproc)
|
||||||
|
ctest -j $(nproc) --output-on-failure
|
||||||
|
coverage:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
platform:
|
||||||
|
- linux
|
||||||
|
compiler:
|
||||||
|
- gcc
|
||||||
|
configuration:
|
||||||
|
- Debug
|
||||||
|
needs: dependencies
|
||||||
|
runs-on: [self-hosted, heavy]
|
||||||
|
container: ghcr.io/xrplf/ci/ubuntu-jammy:gcc-12
|
||||||
|
env:
|
||||||
|
build_dir: .build
|
||||||
|
steps:
|
||||||
|
- name: download cache
|
||||||
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
|
||||||
|
with:
|
||||||
|
name: ${{ matrix.platform }}-${{ matrix.compiler }}-${{ matrix.configuration }}
|
||||||
|
- name: extract cache
|
||||||
|
run: |
|
||||||
|
mkdir -p ${CONAN_HOME}
|
||||||
|
tar -xzf conan.tar.gz -C ${CONAN_HOME}
|
||||||
|
- name: check environment
|
||||||
|
run: |
|
||||||
|
echo ${PATH} | tr ':' '\n'
|
||||||
|
conan --version
|
||||||
|
cmake --version
|
||||||
|
gcovr --version
|
||||||
|
env | sort
|
||||||
|
ls ${CONAN_HOME}
|
||||||
|
- name: checkout
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
|
- name: dependencies
|
||||||
|
uses: ./.github/actions/dependencies
|
||||||
|
with:
|
||||||
|
configuration: ${{ matrix.configuration }}
|
||||||
|
- name: build
|
||||||
|
uses: ./.github/actions/build
|
||||||
|
with:
|
||||||
|
generator: Ninja
|
||||||
|
configuration: ${{ matrix.configuration }}
|
||||||
|
cmake-args: >-
|
||||||
|
-Dassert=TRUE
|
||||||
|
-Dwerr=TRUE
|
||||||
|
-Dcoverage=ON
|
||||||
|
-Dcoverage_format=xml
|
||||||
|
-DCODE_COVERAGE_VERBOSE=ON
|
||||||
|
-DCMAKE_CXX_FLAGS="-O0"
|
||||||
|
-DCMAKE_C_FLAGS="-O0"
|
||||||
|
cmake-target: coverage
|
||||||
|
- name: move coverage report
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mv "${build_dir}/coverage.xml" ./
|
||||||
|
- name: archive coverage report
|
||||||
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
|
||||||
|
with:
|
||||||
|
name: coverage.xml
|
||||||
|
path: coverage.xml
|
||||||
|
retention-days: 30
|
||||||
|
- name: upload coverage report
|
||||||
|
uses: wandalen/wretry.action@v1.4.10
|
||||||
|
with:
|
||||||
|
action: codecov/codecov-action@v4.5.0
|
||||||
|
with: |
|
||||||
|
files: coverage.xml
|
||||||
|
fail_ci_if_error: true
|
||||||
|
disable_search: true
|
||||||
|
verbose: true
|
||||||
|
plugin: noop
|
||||||
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
attempt_limit: 5
|
||||||
|
attempt_delay: 210000 # in milliseconds
|
||||||
|
|
||||||
|
|
||||||
|
conan:
|
||||||
|
needs: dependencies
|
||||||
|
runs-on: [self-hosted, heavy]
|
||||||
|
container:
|
||||||
|
image: ghcr.io/xrplf/ci/ubuntu-jammy:gcc-12
|
||||||
|
env:
|
||||||
|
build_dir: .build
|
||||||
|
platform: linux
|
||||||
|
compiler: gcc
|
||||||
|
compiler_version: 12
|
||||||
|
configuration: Release
|
||||||
|
steps:
|
||||||
|
- name: download cache
|
||||||
|
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
|
||||||
|
with:
|
||||||
|
name: ${{ env.platform }}-${{ env.compiler }}-${{ env.configuration }}
|
||||||
|
|
||||||
|
- name: extract cache
|
||||||
|
run: |
|
||||||
|
mkdir -p ${CONAN_HOME}
|
||||||
|
tar -xzf conan.tar.gz -C ${CONAN_HOME}
|
||||||
|
- name: check environment
|
||||||
|
run: |
|
||||||
|
env | sort
|
||||||
|
echo ${PATH} | tr ':' '\n'
|
||||||
|
conan --version
|
||||||
|
cmake --version
|
||||||
|
- name: checkout
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
|
- name: dependencies
|
||||||
|
uses: ./.github/actions/dependencies
|
||||||
|
with:
|
||||||
|
configuration: ${{ env.configuration }}
|
||||||
|
- name: export
|
||||||
|
run: |
|
||||||
|
conan export . --version head
|
||||||
|
- name: build
|
||||||
|
run: |
|
||||||
|
cd tests/conan
|
||||||
|
mkdir ${build_dir} && cd ${build_dir}
|
||||||
|
conan install .. \
|
||||||
|
--settings:all build_type=${configuration} \
|
||||||
|
--output-folder . \
|
||||||
|
--build missing
|
||||||
|
cmake .. \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE:FILEPATH=./build/${configuration}/generators/conan_toolchain.cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE=${configuration}
|
||||||
|
cmake --build .
|
||||||
|
./example | grep '^[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+'
|
||||||
|
|
||||||
|
# NOTE we are not using dependencies built above because it lags with
|
||||||
|
# compiler versions. Instrumentation requires clang version 16 or
|
||||||
|
# later
|
||||||
|
|
||||||
|
instrumentation-build:
|
||||||
|
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
|
||||||
|
env:
|
||||||
|
CLANG_RELEASE: 16
|
||||||
|
runs-on: [self-hosted, heavy]
|
||||||
|
container: ghcr.io/xrplf/ci/debian-bookworm:clang-16
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: checkout
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
|
|
||||||
|
- name: prepare environment
|
||||||
|
run: |
|
||||||
|
mkdir ${GITHUB_WORKSPACE}/.build
|
||||||
|
echo "SOURCE_DIR=$GITHUB_WORKSPACE" >> $GITHUB_ENV
|
||||||
|
echo "BUILD_DIR=$GITHUB_WORKSPACE/.build" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: configure Conan
|
||||||
|
run: |
|
||||||
|
echo "${CONAN_GLOBAL_CONF}" >> ${CONAN_HOME}/global.conf
|
||||||
|
conan profile show
|
||||||
|
- name: build dependencies
|
||||||
|
run: |
|
||||||
|
cd ${BUILD_DIR}
|
||||||
|
conan install ${SOURCE_DIR} \
|
||||||
|
--output-folder ${BUILD_DIR} \
|
||||||
|
--build missing \
|
||||||
|
--settings:all build_type=Debug
|
||||||
|
|
||||||
|
- name: build with instrumentation
|
||||||
|
run: |
|
||||||
|
cd ${BUILD_DIR}
|
||||||
|
cmake -S ${SOURCE_DIR} -B ${BUILD_DIR} \
|
||||||
|
-Dvoidstar=ON \
|
||||||
|
-Dtests=ON \
|
||||||
|
-Dxrpld=ON \
|
||||||
|
-DCMAKE_BUILD_TYPE=Debug \
|
||||||
|
-DSECP256K1_BUILD_BENCHMARK=OFF \
|
||||||
|
-DSECP256K1_BUILD_TESTS=OFF \
|
||||||
|
-DSECP256K1_BUILD_EXHAUSTIVE_TESTS=OFF \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=${BUILD_DIR}/build/generators/conan_toolchain.cmake
|
||||||
|
cmake --build . --parallel $(nproc)
|
||||||
|
|
||||||
|
- name: verify instrumentation enabled
|
||||||
|
run: |
|
||||||
|
cd ${BUILD_DIR}
|
||||||
|
./rippled --version | grep libvoidstar
|
||||||
|
|
||||||
|
- name: run unit tests
|
||||||
|
run: |
|
||||||
|
cd ${BUILD_DIR}
|
||||||
|
./rippled -u --unittest-jobs $(( $(nproc)/4 ))
|
||||||
|
ctest -j $(nproc) --output-on-failure
|
||||||
|
|||||||
116
.github/workflows/windows.yml
vendored
116
.github/workflows/windows.yml
vendored
@@ -1,37 +1,64 @@
|
|||||||
name: windows
|
name: windows
|
||||||
|
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, reopened, synchronize, ready_for_review]
|
||||||
|
push:
|
||||||
|
# If the branches list is ever changed, be sure to change it on all
|
||||||
|
# build/test jobs (nix, macos, windows, instrumentation)
|
||||||
|
branches:
|
||||||
|
# Always build the package branches
|
||||||
|
- develop
|
||||||
|
- release
|
||||||
|
- master
|
||||||
|
# Branches that opt-in to running
|
||||||
|
- 'ci/**'
|
||||||
|
|
||||||
# https://docs.github.com/en/actions/using-jobs/using-concurrency
|
# https://docs.github.com/en/actions/using-jobs/using-concurrency
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
# 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_GLOBAL_CONF: |
|
||||||
|
core.download:parallel={{os.cpu_count()}}
|
||||||
|
core.upload:parallel={{os.cpu_count()}}
|
||||||
|
tools.build:jobs=24
|
||||||
|
tools.build:verbosity=verbose
|
||||||
|
tools.compilation:verbosity=verbose
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
test:
|
test:
|
||||||
|
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
generator:
|
version:
|
||||||
- Visual Studio 16 2019
|
- generator: Visual Studio 17 2022
|
||||||
|
runs-on: windows-2022
|
||||||
configuration:
|
configuration:
|
||||||
- Release
|
- type: Release
|
||||||
# Github hosted runners tend to hang when running Debug unit tests.
|
tests: true
|
||||||
# Instead of trying to work around it, disable the Debug job until
|
- type: Debug
|
||||||
# something beefier (i.e. a heavy self-hosted runner) becomes
|
# Skip running unit tests on debug builds, because they
|
||||||
# available.
|
# take an unreasonable amount of time
|
||||||
# - Debug
|
tests: false
|
||||||
runs-on: windows-2019
|
runtime: d
|
||||||
|
runs-on: ${{ matrix.version.runs-on }}
|
||||||
env:
|
env:
|
||||||
build_dir: .build
|
build_dir: .build
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
- name: choose Python
|
- name: choose Python
|
||||||
uses: actions/setup-python@v3
|
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065
|
||||||
with:
|
with:
|
||||||
python-version: 3.9
|
python-version: 3.13
|
||||||
- name: learn Python cache directory
|
- name: learn Python cache directory
|
||||||
id: pip-cache
|
id: pip-cache
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -39,62 +66,59 @@ jobs:
|
|||||||
python -m pip install --upgrade pip
|
python -m pip install --upgrade pip
|
||||||
echo "dir=$(pip cache dir)" | tee ${GITHUB_OUTPUT}
|
echo "dir=$(pip cache dir)" | tee ${GITHUB_OUTPUT}
|
||||||
- name: restore Python cache directory
|
- name: restore Python cache directory
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pip-cache.outputs.dir }}
|
path: ${{ steps.pip-cache.outputs.dir }}
|
||||||
key: ${{ runner.os }}-${{ hashFiles('.github/workflows/windows.yml') }}
|
key: ${{ runner.os }}-${{ hashFiles('.github/workflows/windows.yml') }}
|
||||||
- name: install Conan
|
- name: install Conan
|
||||||
run: pip install wheel 'conan<2'
|
run: pip install wheel conan
|
||||||
- name: check environment
|
- name: check environment
|
||||||
run: |
|
run: |
|
||||||
|
dir env:
|
||||||
$env:PATH -split ';'
|
$env:PATH -split ';'
|
||||||
python --version
|
python --version
|
||||||
conan --version
|
conan --version
|
||||||
cmake --version
|
cmake --version
|
||||||
dir env:
|
|
||||||
- name: configure Conan
|
- name: configure Conan
|
||||||
shell: bash
|
shell: bash
|
||||||
env:
|
|
||||||
CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
|
|
||||||
run: |
|
run: |
|
||||||
conan profile new default --detect
|
echo "${CONAN_GLOBAL_CONF}" > global.conf
|
||||||
conan profile update settings.compiler.runtime=MT${{ matrix.configuration == 'Debug' && 'd' || '' }} default
|
mv conan/profiles/libxrpl conan/profiles/default
|
||||||
# Do not quote the URL. An empty string will be accepted (with
|
conan config install conan/profiles/ -tf $(conan config home)/profiles/
|
||||||
# a non-fatal warning), but a missing argument will not.
|
conan profile show
|
||||||
conan remote add ripple ${{ env.CONAN_URL }} --insert 0
|
- name: export custom recipes
|
||||||
- name: try to authenticate to ripple Conan remote
|
|
||||||
shell: bash
|
shell: bash
|
||||||
id: remote
|
|
||||||
run: |
|
run: |
|
||||||
echo outcome=$(conan user --remote ripple ${{ secrets.CONAN_USERNAME }} \
|
conan export --version 1.1.10 external/snappy
|
||||||
--password ${{ secrets.CONAN_TOKEN }} >&2 && echo success || \
|
conan export --version 9.7.3 external/rocksdb
|
||||||
echo failure) | tee ${GITHUB_OUTPUT}
|
conan export --version 4.0.3 external/soci
|
||||||
- name: list missing binaries
|
conan export --version 2.0.8 external/nudb
|
||||||
id: binaries
|
- name: add Ripple Conan remote
|
||||||
|
if: env.CONAN_URL != ''
|
||||||
shell: bash
|
shell: bash
|
||||||
# Print the list of dependencies that would need to be built locally.
|
|
||||||
# A non-empty list means we have "failed" to cache binaries remotely.
|
|
||||||
run: |
|
run: |
|
||||||
echo missing=$(conan info . --build missing --settings build_type=${{ matrix.configuration }} --json 2>/dev/null | grep '^\[') | tee ${GITHUB_OUTPUT}
|
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
|
- name: build dependencies
|
||||||
uses: ./.github/actions/dependencies
|
uses: ./.github/actions/dependencies
|
||||||
with:
|
with:
|
||||||
configuration: ${{ matrix.configuration }}
|
configuration: ${{ matrix.configuration.type }}
|
||||||
- name: upload dependencies to remote
|
|
||||||
if: (steps.binaries.outputs.missing != '[]') && (steps.remote.outputs.outcome == 'success')
|
|
||||||
run: conan upload --remote ripple '*' --all --parallel --confirm
|
|
||||||
- name: build
|
- name: build
|
||||||
uses: ./.github/actions/build
|
uses: ./.github/actions/build
|
||||||
with:
|
with:
|
||||||
generator: '${{ matrix.generator }}'
|
generator: '${{ matrix.version.generator }}'
|
||||||
configuration: ${{ matrix.configuration }}
|
configuration: ${{ matrix.configuration.type }}
|
||||||
# Hard code for now. Move to the matrix if varied options are needed
|
# Hard code for now. Move to the matrix if varied options are needed
|
||||||
cmake-args: '-Dassert=ON -Dreporting=OFF -Dunity=ON'
|
cmake-args: '-Dassert=TRUE -Dwerr=TRUE -Dreporting=OFF -Dunity=ON'
|
||||||
- name: test (permitted to silently fail)
|
cmake-target: install
|
||||||
|
- name: test
|
||||||
shell: bash
|
shell: bash
|
||||||
# Github runners are resource limited, which causes unit tests to fail
|
if: ${{ matrix.configuration.tests }}
|
||||||
# (e.g. OOM). To allow forward progress until self-hosted runners are
|
|
||||||
# up and running reliably, allow the job to succeed even if tests fail.
|
|
||||||
continue-on-error: true
|
|
||||||
run: |
|
run: |
|
||||||
${build_dir}/${{ matrix.configuration }}/rippled --unittest --unittest-jobs $(nproc)
|
cd ${build_dir}/${{ matrix.configuration.type }}
|
||||||
|
./rippled --unittest --unittest-jobs $(nproc)
|
||||||
|
ctest -j $(nproc) --output-on-failure
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# .pre-commit-config.yaml
|
# .pre-commit-config.yaml
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/pre-commit/mirrors-clang-format
|
- repo: https://github.com/pre-commit/mirrors-clang-format
|
||||||
rev: v10.0.1
|
rev: v18.1.8
|
||||||
hooks:
|
hooks:
|
||||||
- id: clang-format
|
- id: clang-format
|
||||||
|
|||||||
193
API-CHANGELOG.md
193
API-CHANGELOG.md
@@ -8,42 +8,138 @@ The API version controls the API behavior you see. This includes what properties
|
|||||||
|
|
||||||
For a log of breaking changes, see the **API Version [number]** headings. In general, breaking changes are associated with a particular API Version number. For non-breaking changes, scroll to the **XRP Ledger version [x.y.z]** headings. Non-breaking changes are associated with a particular XRP Ledger (`rippled`) release.
|
For a log of breaking changes, see the **API Version [number]** headings. In general, breaking changes are associated with a particular API Version number. For non-breaking changes, scroll to the **XRP Ledger version [x.y.z]** headings. Non-breaking changes are associated with a particular XRP Ledger (`rippled`) release.
|
||||||
|
|
||||||
|
## API Version 2
|
||||||
|
|
||||||
|
API version 2 is available in `rippled` version 2.0.0 and later. To use this API, clients specify `"api_version" : 2` in each request.
|
||||||
|
|
||||||
|
#### Removed methods
|
||||||
|
|
||||||
|
In API version 2, the following deprecated methods are no longer available: (https://github.com/XRPLF/rippled/pull/4759)
|
||||||
|
|
||||||
|
- `tx_history` - Instead, use other methods such as `account_tx` or `ledger` with the `transactions` field set to `true`.
|
||||||
|
- `ledger_header` - Instead, use the `ledger` method.
|
||||||
|
|
||||||
|
#### Modifications to JSON transaction element in V2
|
||||||
|
|
||||||
|
In API version 2, JSON elements for transaction output have been changed and made consistent for all methods which output transactions. (https://github.com/XRPLF/rippled/pull/4775)
|
||||||
|
This helps to unify the JSON serialization format of transactions. (https://github.com/XRPLF/clio/issues/722, https://github.com/XRPLF/rippled/issues/4727)
|
||||||
|
|
||||||
|
- JSON transaction element is named `tx_json`
|
||||||
|
- Binary transaction element is named `tx_blob`
|
||||||
|
- JSON transaction metadata element is named `meta`
|
||||||
|
- Binary transaction metadata element is named `meta_blob`
|
||||||
|
|
||||||
|
Additionally, these elements are now consistently available next to `tx_json` (i.e. sibling elements), where possible:
|
||||||
|
|
||||||
|
- `hash` - Transaction ID. This data was stored inside transaction output in API version 1, but in API version 2 is a sibling element.
|
||||||
|
- `ledger_index` - Ledger index (only set on validated ledgers)
|
||||||
|
- `ledger_hash` - Ledger hash (only set on closed or validated ledgers)
|
||||||
|
- `close_time_iso` - Ledger close time expressed in ISO 8601 time format (only set on validated ledgers)
|
||||||
|
- `validated` - Bool element set to `true` if the transaction is in a validated ledger, otherwise `false`
|
||||||
|
|
||||||
|
This change affects the following methods:
|
||||||
|
|
||||||
|
- `tx` - Transaction data moved into element `tx_json` (was inline inside `result`) or, if binary output was requested, moved from `tx` to `tx_blob`. Renamed binary transaction metadata element (if it was requested) from `meta` to `meta_blob`. Changed location of `hash` and added new elements
|
||||||
|
- `account_tx` - Renamed transaction element from `tx` to `tx_json`. Renamed binary transaction metadata element (if it was requested) from `meta` to `meta_blob`. Changed location of `hash` and added new elements
|
||||||
|
- `transaction_entry` - Renamed transaction metadata element from `metadata` to `meta`. Changed location of `hash` and added new elements
|
||||||
|
- `subscribe` - Renamed transaction element from `transaction` to `tx_json`. Changed location of `hash` and added new elements
|
||||||
|
- `sign`, `sign_for`, `submit` and `submit_multisigned` - Changed location of `hash` element.
|
||||||
|
|
||||||
|
#### Modification to `Payment` transaction JSON schema
|
||||||
|
|
||||||
|
When reading Payments, the `Amount` field should generally **not** be used. Instead, use [delivered_amount](https://xrpl.org/partial-payments.html#the-delivered_amount-field) to see the amount that the Payment delivered. To clarify its meaning, the `Amount` field is being renamed to `DeliverMax`. (https://github.com/XRPLF/rippled/pull/4733)
|
||||||
|
|
||||||
|
- In `Payment` transaction type, JSON RPC field `Amount` is renamed to `DeliverMax`. To enable smooth client transition, `Amount` is still handled, as described below: (https://github.com/XRPLF/rippled/pull/4733)
|
||||||
|
- On JSON RPC input (e.g. `submit_multisigned` etc. methods), `Amount` is recognized as an alias to `DeliverMax` for both API version 1 and version 2 clients.
|
||||||
|
- On JSON RPC input, submitting both `Amount` and `DeliverMax` fields is allowed _only_ if they are identical; otherwise such input is rejected with `rpcINVALID_PARAMS` error.
|
||||||
|
- On JSON RPC output (e.g. `subscribe`, `account_tx` etc. methods), `DeliverMax` is present in both API version 1 and version 2.
|
||||||
|
- On JSON RPC output, `Amount` is only present in API version 1 and _not_ in version 2.
|
||||||
|
|
||||||
|
#### Modifications to account_info response
|
||||||
|
|
||||||
|
- `signer_lists` is returned in the root of the response. (In API version 1, it was nested under `account_data`.) (https://github.com/XRPLF/rippled/pull/3770)
|
||||||
|
- When using an invalid `signer_lists` value, the API now returns an "invalidParams" error. (https://github.com/XRPLF/rippled/pull/4585)
|
||||||
|
- (`signer_lists` must be a boolean. In API version 1, strings were accepted and may return a normal response - i.e. as if `signer_lists` were `true`.)
|
||||||
|
|
||||||
|
#### Modifications to [account_tx](https://xrpl.org/account_tx.html#account_tx) response
|
||||||
|
|
||||||
|
- Using `ledger_index_min`, `ledger_index_max`, and `ledger_index` returns `invalidParams` because if you use `ledger_index_min` or `ledger_index_max`, then it does not make sense to also specify `ledger_index`. In API version 1, no error was returned. (https://github.com/XRPLF/rippled/pull/4571)
|
||||||
|
- The same applies for `ledger_index_min`, `ledger_index_max`, and `ledger_hash`. (https://github.com/XRPLF/rippled/issues/4545#issuecomment-1565065579)
|
||||||
|
- Using a `ledger_index_min` or `ledger_index_max` beyond the range of ledgers that the server has:
|
||||||
|
- returns `lgrIdxMalformed` in API version 2. Previously, in API version 1, no error was returned. (https://github.com/XRPLF/rippled/issues/4288)
|
||||||
|
- Attempting to use a non-boolean value (such as a string) for the `binary` or `forward` parameters returns `invalidParams` (`rpcINVALID_PARAMS`). Previously, in API version 1, no error was returned. (https://github.com/XRPLF/rippled/pull/4620)
|
||||||
|
|
||||||
|
#### Modifications to [noripple_check](https://xrpl.org/noripple_check.html#noripple_check) response
|
||||||
|
|
||||||
|
- Attempting to use a non-boolean value (such as a string) for the `transactions` parameter returns `invalidParams` (`rpcINVALID_PARAMS`). Previously, in API version 1, no error was returned. (https://github.com/XRPLF/rippled/pull/4620)
|
||||||
|
|
||||||
## API Version 1
|
## API Version 1
|
||||||
|
|
||||||
This version is supported by all `rippled` versions. At time of writing, it is the default API version, used when no `api_version` is specified. When a new API version is introduced, the command line interface will default to the latest API version. The command line is intended for ad-hoc usage by humans, not programs or automated scripts. The command line is not meant for use in production code.
|
This version is supported by all `rippled` versions. For WebSocket and HTTP JSON-RPC requests, it is currently the default API version used when no `api_version` is specified.
|
||||||
|
|
||||||
### Idiosyncrasies
|
The [commandline](https://xrpl.org/docs/references/http-websocket-apis/api-conventions/request-formatting/#commandline-format) always uses the latest API version. The command line is intended for ad-hoc usage by humans, not programs or automated scripts. The command line is not meant for use in production code.
|
||||||
|
|
||||||
#### V1 account_info response
|
### Inconsistency: server_info - network_id
|
||||||
|
|
||||||
In [the response to the `account_info` command](https://xrpl.org/account_info.html#response-format), there is `account_data` - which is supposed to be an `AccountRoot` object - and `signer_lists` is returned in this object. However, the docs say that `signer_lists` should be at the root level of the reponse.
|
The `network_id` field was added in the `server_info` response in version 1.5.0 (2019), but it is not returned in [reporting mode](https://xrpl.org/rippled-server-modes.html#reporting-mode). However, use of reporting mode is now discouraged, in favor of using [Clio](https://github.com/XRPLF/clio) instead.
|
||||||
|
|
||||||
It makes sense for `signer_lists` to be at the root level because signer lists are not part of the AccountRoot object. (First reported in [xrpl-dev-portal#938](https://github.com/XRPLF/xrpl-dev-portal/issues/938).)
|
## XRP Ledger server version 2.5.0
|
||||||
|
|
||||||
In `api_version: 2`, the `signer_lists` field [will be moved](#modifications-to-account_info-response-in-v2) to the root level of the account_info response. (https://github.com/XRPLF/rippled/pull/3770)
|
As of 2025-04-04, version 2.5.0 is in development. You can use a pre-release version by building from source or [using the `nightly` package](https://xrpl.org/docs/infrastructure/installation/install-rippled-on-ubuntu).
|
||||||
|
|
||||||
#### server_info - network_id
|
### Additions and bugfixes in 2.5.0
|
||||||
|
|
||||||
The `network_id` field was added in the `server_info` response in version 1.5.0 (2019), but it is not returned in [reporting mode](https://xrpl.org/rippled-server-modes.html#reporting-mode).
|
- `channel_authorize`: If `signing_support` is not enabled in the config, the RPC is disabled.
|
||||||
|
|
||||||
|
## XRP Ledger server version 2.4.0
|
||||||
|
|
||||||
|
[Version 2.4.0](https://github.com/XRPLF/rippled/releases/tag/2.4.0) was released on March 4, 2025.
|
||||||
|
|
||||||
|
### Additions and bugfixes in 2.4.0
|
||||||
|
|
||||||
|
- `ledger_entry`: `state` is added an alias for `ripple_state`.
|
||||||
|
- `ledger_entry`: Enables case-insensitive filtering by canonical name in addition to case-sensitive filtering by RPC name.
|
||||||
|
- `validators`: Added new field `validator_list_threshold` in response.
|
||||||
|
- `simulate`: A new RPC that executes a [dry run of a transaction submission](https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0069d-simulate#2-rpc-simulate)
|
||||||
|
- Signing methods autofill fees better and properly handle transactions that don't have a base fee, and will also autofill the `NetworkID` field.
|
||||||
|
|
||||||
|
## XRP Ledger server version 2.3.0
|
||||||
|
|
||||||
|
[Version 2.3.0](https://github.com/XRPLF/rippled/releases/tag/2.3.0) was released on Nov 25, 2024.
|
||||||
|
|
||||||
|
### Breaking changes in 2.3.0
|
||||||
|
|
||||||
|
- `book_changes`: If the requested ledger version is not available on this node, a `ledgerNotFound` error is returned and the node does not attempt to acquire the ledger from the p2p network (as with other non-admin RPCs).
|
||||||
|
|
||||||
|
Admins can still attempt to retrieve old ledgers with the `ledger_request` RPC.
|
||||||
|
|
||||||
|
### Additions and bugfixes in 2.3.0
|
||||||
|
|
||||||
|
- `book_changes`: Returns a `validated` field in its response, which was missing in prior versions.
|
||||||
|
|
||||||
|
## XRP Ledger server version 2.2.0
|
||||||
|
|
||||||
|
[Version 2.2.0](https://github.com/XRPLF/rippled/releases/tag/2.2.0) was released on Jun 5, 2024. The following additions are non-breaking (because they are purely additive):
|
||||||
|
|
||||||
|
- The `feature` method now has a non-admin mode for users. (It was previously only available to admin connections.) The method returns an updated list of amendments, including their names and other information. ([#4781](https://github.com/XRPLF/rippled/pull/4781))
|
||||||
|
|
||||||
## XRP Ledger server version 2.0.0
|
## XRP Ledger server version 2.0.0
|
||||||
|
|
||||||
### Additions in 2.0
|
[Version 2.0.0](https://github.com/XRPLF/rippled/releases/tag/2.0.0) was released on Jan 9, 2024. The following additions are non-breaking (because they are purely additive):
|
||||||
|
|
||||||
Additions are intended to be non-breaking (because they are purely additive).
|
|
||||||
|
|
||||||
- `server_definitions`: A new RPC that generates a `definitions.json`-like output that can be used in XRPL libraries.
|
- `server_definitions`: A new RPC that generates a `definitions.json`-like output that can be used in XRPL libraries.
|
||||||
- In `Payment` transactions, `DeliverMax` has been added. This is a replacement for the `Amount` field, which should not be used. Typically, the `delivered_amount` (in transaction metadata) should be used. To ease the transition, `DeliverMax` is present regardless of API version, since adding a field is non-breaking.
|
- In `Payment` transactions, `DeliverMax` has been added. This is a replacement for the `Amount` field, which should not be used. Typically, the `delivered_amount` (in transaction metadata) should be used. To ease the transition, `DeliverMax` is present regardless of API version, since adding a field is non-breaking.
|
||||||
- API version 2 has been moved from beta to supported, meaning that it is generally available (regardless of the `beta_rpc_api` setting).
|
- API version 2 has been moved from beta to supported, meaning that it is generally available (regardless of the `beta_rpc_api` setting).
|
||||||
|
|
||||||
|
## XRP Ledger server version 2.2.0
|
||||||
|
|
||||||
|
The following is a non-breaking addition to the API.
|
||||||
|
|
||||||
|
- The `feature` method now has a non-admin mode for users. (It was previously only available to admin connections.) The method returns an updated list of amendments, including their names and other information. ([#4781](https://github.com/XRPLF/rippled/pull/4781))
|
||||||
|
|
||||||
## XRP Ledger server version 1.12.0
|
## XRP Ledger server version 1.12.0
|
||||||
|
|
||||||
[Version 1.12.0](https://github.com/XRPLF/rippled/releases/tag/1.12.0) was released on Sep 6, 2023.
|
[Version 1.12.0](https://github.com/XRPLF/rippled/releases/tag/1.12.0) was released on Sep 6, 2023. The following additions are non-breaking (because they are purely additive).
|
||||||
|
|
||||||
### Additions in 1.12
|
|
||||||
|
|
||||||
Additions are intended to be non-breaking (because they are purely additive).
|
|
||||||
|
|
||||||
- `server_info`: Added `ports`, an array which advertises the RPC and WebSocket ports. This information is also included in the `/crawl` endpoint (which calls `server_info` internally). `grpc` and `peer` ports are also included. (https://github.com/XRPLF/rippled/pull/4427)
|
- `server_info`: Added `ports`, an array which advertises the RPC and WebSocket ports. This information is also included in the `/crawl` endpoint (which calls `server_info` internally). `grpc` and `peer` ports are also included. (https://github.com/XRPLF/rippled/pull/4427)
|
||||||
- `ports` contains objects, each containing a `port` for the listening port (a number string), and a `protocol` array listing the supported protocols on that port.
|
- `ports` contains objects, each containing a `port` for the listening port (a number string), and a `protocol` array listing the supported protocols on that port.
|
||||||
@@ -120,71 +216,6 @@ was released on Mar 14, 2023.
|
|||||||
removed from the [ledger subscription stream](https://xrpl.org/subscribe.html#ledger-stream), because it will no longer
|
removed from the [ledger subscription stream](https://xrpl.org/subscribe.html#ledger-stream), because it will no longer
|
||||||
have any meaning.
|
have any meaning.
|
||||||
|
|
||||||
## API Version 2
|
|
||||||
|
|
||||||
API version 2 is introduced in `rippled` version 2.0. Users can request it explicitly by specifying `"api_version" : 2`.
|
|
||||||
|
|
||||||
#### Removed methods
|
|
||||||
|
|
||||||
In API version 2, the following deprecated methods are no longer available: (https://github.com/XRPLF/rippled/pull/4759)
|
|
||||||
|
|
||||||
- `tx_history` - Instead, use other methods such as `account_tx` or `ledger` with the `transactions` field set to `true`.
|
|
||||||
- `ledger_header` - Instead, use the `ledger` method.
|
|
||||||
|
|
||||||
#### Modifications to JSON transaction element in V2
|
|
||||||
|
|
||||||
In API version 2, JSON elements for transaction output have been changed and made consistent for all methods which output transactions. (https://github.com/XRPLF/rippled/pull/4775)
|
|
||||||
This helps to unify the JSON serialization format of transactions. (https://github.com/XRPLF/clio/issues/722, https://github.com/XRPLF/rippled/issues/4727)
|
|
||||||
|
|
||||||
- JSON transaction element is named `tx_json`
|
|
||||||
- Binary transaction element is named `tx_blob`
|
|
||||||
- JSON transaction metadata element is named `meta`
|
|
||||||
- Binary transaction metadata element is named `meta_blob`
|
|
||||||
|
|
||||||
Additionally, these elements are now consistently available next to `tx_json` (i.e. sibling elements), where possible:
|
|
||||||
|
|
||||||
- `hash` - Transaction ID. This data was stored inside transaction output in API version 1, but in API version 2 is a sibling element.
|
|
||||||
- `ledger_index` - Ledger index (only set on validated ledgers)
|
|
||||||
- `ledger_hash` - Ledger hash (only set on closed or validated ledgers)
|
|
||||||
- `close_time_iso` - Ledger close time expressed in ISO 8601 time format (only set on validated ledgers)
|
|
||||||
- `validated` - Bool element set to `true` if the transaction is in a validated ledger, otherwise `false`
|
|
||||||
|
|
||||||
This change affects the following methods:
|
|
||||||
|
|
||||||
- `tx` - Transaction data moved into element `tx_json` (was inline inside `result`) or, if binary output was requested, moved from `tx` to `tx_blob`. Renamed binary transaction metadata element (if it was requested) from `meta` to `meta_blob`. Changed location of `hash` and added new elements
|
|
||||||
- `account_tx` - Renamed transaction element from `tx` to `tx_json`. Renamed binary transaction metadata element (if it was requested) from `meta` to `meta_blob`. Changed location of `hash` and added new elements
|
|
||||||
- `transaction_entry` - Renamed transaction metadata element from `metadata` to `meta`. Changed location of `hash` and added new elements
|
|
||||||
- `subscribe` - Renamed transaction element from `transaction` to `tx_json`. Changed location of `hash` and added new elements
|
|
||||||
- `sign`, `sign_for`, `submit` and `submit_multisigned` - Changed location of `hash` element.
|
|
||||||
|
|
||||||
#### Modification to `Payment` transaction JSON schema
|
|
||||||
|
|
||||||
When reading Payments, the `Amount` field should generally **not** be used. Instead, use [delivered_amount](https://xrpl.org/partial-payments.html#the-delivered_amount-field) to see the amount that the Payment delivered. To clarify its meaning, the `Amount` field is being renamed to `DeliverMax`. (https://github.com/XRPLF/rippled/pull/4733)
|
|
||||||
|
|
||||||
- In `Payment` transaction type, JSON RPC field `Amount` is renamed to `DeliverMax`. To enable smooth client transition, `Amount` is still handled, as described below: (https://github.com/XRPLF/rippled/pull/4733)
|
|
||||||
- On JSON RPC input (e.g. `submit_multisigned` etc. methods), `Amount` is recognized as an alias to `DeliverMax` for both API version 1 and version 2 clients.
|
|
||||||
- On JSON RPC input, submitting both `Amount` and `DeliverMax` fields is allowed _only_ if they are identical; otherwise such input is rejected with `rpcINVALID_PARAMS` error.
|
|
||||||
- On JSON RPC output (e.g. `subscribe`, `account_tx` etc. methods), `DeliverMax` is present in both API version 1 and version 2.
|
|
||||||
- On JSON RPC output, `Amount` is only present in API version 1 and _not_ in version 2.
|
|
||||||
|
|
||||||
#### Modifications to account_info response
|
|
||||||
|
|
||||||
- `signer_lists` is returned in the root of the response. In API version 1, it was nested under `account_data`. (https://github.com/XRPLF/rippled/pull/3770)
|
|
||||||
- When using an invalid `signer_lists` value, the API now returns an "invalidParams" error. (https://github.com/XRPLF/rippled/pull/4585)
|
|
||||||
- (`signer_lists` must be a boolean. In API version 1, strings were accepted and may return a normal response - i.e. as if `signer_lists` were `true`.)
|
|
||||||
|
|
||||||
#### Modifications to [account_tx](https://xrpl.org/account_tx.html#account_tx) response
|
|
||||||
|
|
||||||
- Using `ledger_index_min`, `ledger_index_max`, and `ledger_index` returns `invalidParams` because if you use `ledger_index_min` or `ledger_index_max`, then it does not make sense to also specify `ledger_index`. In API version 1, no error was returned. (https://github.com/XRPLF/rippled/pull/4571)
|
|
||||||
- The same applies for `ledger_index_min`, `ledger_index_max`, and `ledger_hash`. (https://github.com/XRPLF/rippled/issues/4545#issuecomment-1565065579)
|
|
||||||
- Using a `ledger_index_min` or `ledger_index_max` beyond the range of ledgers that the server has:
|
|
||||||
- returns `lgrIdxMalformed` in API version 2. Previously, in API version 1, no error was returned. (https://github.com/XRPLF/rippled/issues/4288)
|
|
||||||
- Attempting to use a non-boolean value (such as a string) for the `binary` or `forward` parameters returns `invalidParams` (`rpcINVALID_PARAMS`). Previously, in API version 1, no error was returned. (https://github.com/XRPLF/rippled/pull/4620)
|
|
||||||
|
|
||||||
#### Modifications to [noripple_check](https://xrpl.org/noripple_check.html#noripple_check) response
|
|
||||||
|
|
||||||
- Attempting to use a non-boolean value (such as a string) for the `transactions` parameter returns `invalidParams` (`rpcINVALID_PARAMS`). Previously, in API version 1, no error was returned. (https://github.com/XRPLF/rippled/pull/4620)
|
|
||||||
|
|
||||||
# Unit tests for API changes
|
# Unit tests for API changes
|
||||||
|
|
||||||
The following information is useful to developers contributing to this project:
|
The following information is useful to developers contributing to this project:
|
||||||
|
|||||||
179
BUILD.md
179
BUILD.md
@@ -36,9 +36,15 @@ 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/)
|
- [Python 3.7](https://www.python.org/downloads/)
|
||||||
- [Conan 1.55](https://conan.io/downloads.html)
|
- [Conan 1.60](https://conan.io/downloads.html)[^1]
|
||||||
- [CMake 3.16](https://cmake.org/download/)
|
- [CMake 3.16](https://cmake.org/download/)
|
||||||
|
|
||||||
|
[^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.
|
||||||
|
|
||||||
`rippled` is written in the C++20 dialect and includes the `<concepts>` header.
|
`rippled` is written in the C++20 dialect and includes the `<concepts>` header.
|
||||||
The [minimum compiler versions][2] required are:
|
The [minimum compiler versions][2] required are:
|
||||||
|
|
||||||
@@ -67,9 +73,6 @@ Here are [sample instructions for setting up a C++ development environment on ma
|
|||||||
Windows is not recommended for production use at this time.
|
Windows is not recommended for production use at this time.
|
||||||
|
|
||||||
- Additionally, 32-bit Windows development is not supported.
|
- Additionally, 32-bit Windows development is not supported.
|
||||||
- Visual Studio 2022 is not yet supported.
|
|
||||||
- rippled generally requires [Boost][] 1.77, which Conan cannot build with VS 2022.
|
|
||||||
- Until rippled is updated for compatibility with later versions of Boost, Windows developers may need to use Visual Studio 2019.
|
|
||||||
|
|
||||||
[Boost]: https://www.boost.org/
|
[Boost]: https://www.boost.org/
|
||||||
|
|
||||||
@@ -95,6 +98,12 @@ Update the compiler settings:
|
|||||||
conan profile update settings.compiler.cppstd=20 default
|
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
|
**Linux** developers will commonly have a default Conan [profile][] that compiles
|
||||||
with GCC and links with libstdc++.
|
with GCC and links with libstdc++.
|
||||||
If you are linking with libstdc++ (see profile setting `compiler.libcxx`),
|
If you are linking with libstdc++ (see profile setting `compiler.libcxx`),
|
||||||
@@ -104,6 +113,20 @@ then you will need to choose the `libstdc++11` ABI:
|
|||||||
conan profile update settings.compiler.libcxx=libstdc++11 default
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
**Windows** developers may need to use the x64 native build tools.
|
**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
|
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.
|
Prompt" for the version of Visual Studio that you have installed.
|
||||||
@@ -144,14 +167,41 @@ It does not explicitly link the C++ standard library,
|
|||||||
which allows you to statically link it with GCC, if you want.
|
which allows you to statically link it with GCC, if you want.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
# Conan 1.x
|
||||||
conan export external/snappy snappy/1.1.10@
|
conan export external/snappy snappy/1.1.10@
|
||||||
|
# Conan 2.x
|
||||||
|
conan export --version 1.1.10 external/snappy
|
||||||
|
```
|
||||||
|
|
||||||
|
Export our [Conan recipe for RocksDB](./external/rocksdb).
|
||||||
|
It does not override paths to dependencies when building with Visual Studio.
|
||||||
|
|
||||||
|
```
|
||||||
|
# Conan 1.x
|
||||||
|
conan export external/rocksdb rocksdb/9.7.3@
|
||||||
|
# Conan 2.x
|
||||||
|
conan export --version 9.7.3 external/rocksdb
|
||||||
```
|
```
|
||||||
|
|
||||||
Export our [Conan recipe for SOCI](./external/soci).
|
Export our [Conan recipe for SOCI](./external/soci).
|
||||||
It patches their CMake to correctly import its dependencies.
|
It patches their CMake to correctly import its dependencies.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
# Conan 1.x
|
||||||
conan export external/soci soci/4.0.3@
|
conan export external/soci soci/4.0.3@
|
||||||
|
# Conan 2.x
|
||||||
|
conan export --version 4.0.3 external/soci
|
||||||
|
```
|
||||||
|
|
||||||
|
Export our [Conan recipe for NuDB](./external/nudb).
|
||||||
|
It fixes some source files to add missing `#include`s.
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
# Conan 1.x
|
||||||
|
conan export external/nudb nudb/2.0.8@
|
||||||
|
# Conan 2.x
|
||||||
|
conan export --version 2.0.8 external/nudb
|
||||||
```
|
```
|
||||||
|
|
||||||
### Build and Test
|
### Build and Test
|
||||||
@@ -172,13 +222,15 @@ It patches their CMake to correctly import its dependencies.
|
|||||||
the `install-folder` or `-if` option to every `conan install` command
|
the `install-folder` or `-if` option to every `conan install` command
|
||||||
in the next step.
|
in the next step.
|
||||||
|
|
||||||
2. Generate CMake files for every configuration you want to build.
|
2. Use conan to generate CMake files for every configuration you want to build:
|
||||||
|
|
||||||
```
|
```
|
||||||
conan install .. --output-folder . --build missing --settings build_type=Release
|
conan install .. --output-folder . --build missing --settings build_type=Release
|
||||||
conan install .. --output-folder . --build missing --settings build_type=Debug
|
conan install .. --output-folder . --build missing --settings build_type=Debug
|
||||||
```
|
```
|
||||||
|
|
||||||
|
To build Debug, in the next step, be sure to set `-DCMAKE_BUILD_TYPE=Debug`
|
||||||
|
|
||||||
For a single-configuration generator, e.g. `Unix Makefiles` or `Ninja`,
|
For a single-configuration generator, e.g. `Unix Makefiles` or `Ninja`,
|
||||||
you only need to run this command once.
|
you only need to run this command once.
|
||||||
For a multi-configuration generator, e.g. `Visual Studio`, you may want to
|
For a multi-configuration generator, e.g. `Visual Studio`, you may want to
|
||||||
@@ -189,13 +241,13 @@ It patches their CMake to correctly import its dependencies.
|
|||||||
generated by the first. You can pass the build type on the command line with
|
generated by the first. You can pass the build type on the command line with
|
||||||
`--settings build_type=$BUILD_TYPE` or in the profile itself,
|
`--settings build_type=$BUILD_TYPE` or in the profile itself,
|
||||||
under the section `[settings]` with the key `build_type`.
|
under the section `[settings]` with the key `build_type`.
|
||||||
|
|
||||||
If you are using a Microsoft Visual C++ compiler,
|
If you are using a Microsoft Visual C++ compiler,
|
||||||
then you will need to ensure consistency between the `build_type` setting
|
then you will need to ensure consistency between the `build_type` setting
|
||||||
and the `compiler.runtime` setting.
|
and the `compiler.runtime` setting.
|
||||||
|
|
||||||
When `build_type` is `Release`, `compiler.runtime` should be `MT`.
|
When `build_type` is `Release`, `compiler.runtime` should be `MT`.
|
||||||
|
|
||||||
When `build_type` is `Debug`, `compiler.runtime` should be `MTd`.
|
When `build_type` is `Debug`, `compiler.runtime` should be `MTd`.
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -208,23 +260,26 @@ It patches their CMake to correctly import its dependencies.
|
|||||||
|
|
||||||
Single-config generators:
|
Single-config generators:
|
||||||
|
|
||||||
|
Pass the CMake variable [`CMAKE_BUILD_TYPE`][build_type]
|
||||||
|
and make sure it matches the one of the `build_type` settings
|
||||||
|
you chose in the previous step.
|
||||||
|
|
||||||
|
For example, to build Debug, in the next command, replace "Release" with "Debug"
|
||||||
|
|
||||||
```
|
```
|
||||||
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
|
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -Dxrpld=ON -Dtests=ON ..
|
||||||
```
|
```
|
||||||
|
|
||||||
Pass the CMake variable [`CMAKE_BUILD_TYPE`][build_type]
|
|
||||||
and make sure it matches the `build_type` setting you chose in the previous
|
|
||||||
step.
|
|
||||||
|
|
||||||
Multi-config generators:
|
Multi-config generators:
|
||||||
|
|
||||||
```
|
```
|
||||||
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake ..
|
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -Dxrpld=ON -Dtests=ON ..
|
||||||
```
|
```
|
||||||
|
|
||||||
**Note:** You can pass build options for `rippled` in this step.
|
**Note:** You can pass build options for `rippled` in this step.
|
||||||
|
|
||||||
4. Build `rippled`.
|
5. Build `rippled`.
|
||||||
|
|
||||||
For a single-configuration generator, it will build whatever configuration
|
For a single-configuration generator, it will build whatever configuration
|
||||||
you passed for `CMAKE_BUILD_TYPE`. For a multi-configuration generator,
|
you passed for `CMAKE_BUILD_TYPE`. For a multi-configuration generator,
|
||||||
@@ -233,7 +288,7 @@ It patches their CMake to correctly import its dependencies.
|
|||||||
Single-config generators:
|
Single-config generators:
|
||||||
|
|
||||||
```
|
```
|
||||||
cmake --build .
|
cmake --build . -j $(nproc)
|
||||||
```
|
```
|
||||||
|
|
||||||
Multi-config generators:
|
Multi-config generators:
|
||||||
@@ -243,7 +298,7 @@ It patches their CMake to correctly import its dependencies.
|
|||||||
cmake --build . --config Debug
|
cmake --build . --config Debug
|
||||||
```
|
```
|
||||||
|
|
||||||
5. Test rippled.
|
6. Test rippled.
|
||||||
|
|
||||||
Single-config generators:
|
Single-config generators:
|
||||||
|
|
||||||
@@ -262,15 +317,75 @@ It patches their CMake to correctly import its dependencies.
|
|||||||
generator. Pass `--help` to see the rest of the command line options.
|
generator. Pass `--help` to see the rest of the command line options.
|
||||||
|
|
||||||
|
|
||||||
|
## Coverage report
|
||||||
|
|
||||||
|
The coverage report is intended for developers using compilers GCC
|
||||||
|
or Clang (including Apple Clang). It is generated by the build target `coverage`,
|
||||||
|
which is only enabled when the `coverage` option is set, e.g. with
|
||||||
|
`--options coverage=True` in `conan` or `-Dcoverage=ON` variable in `cmake`
|
||||||
|
|
||||||
|
Prerequisites for the coverage report:
|
||||||
|
|
||||||
|
- [gcovr tool][gcovr] (can be installed e.g. with [pip][python-pip])
|
||||||
|
- `gcov` for GCC (installed with the compiler by default) or
|
||||||
|
- `llvm-cov` for Clang (installed with the compiler by default)
|
||||||
|
- `Debug` build type
|
||||||
|
|
||||||
|
A coverage report is created when the following steps are completed, in order:
|
||||||
|
|
||||||
|
1. `rippled` binary built with instrumentation data, enabled by the `coverage`
|
||||||
|
option mentioned above
|
||||||
|
2. completed run of unit tests, which populates coverage capture data
|
||||||
|
3. completed run of the `gcovr` tool (which internally invokes either `gcov` or `llvm-cov`)
|
||||||
|
to assemble both instrumentation data and the coverage capture data into a coverage report
|
||||||
|
|
||||||
|
The above steps are automated into a single target `coverage`. The instrumented
|
||||||
|
`rippled` binary can also be used for regular development or testing work, at
|
||||||
|
the cost of extra disk space utilization and a small performance hit
|
||||||
|
(to store coverage capture). In case of a spurious failure of unit tests, it is
|
||||||
|
possible to re-run the `coverage` target without rebuilding the `rippled` binary
|
||||||
|
(since it is simply a dependency of the coverage report target). It is also possible
|
||||||
|
to select only specific tests for the purpose of the coverage report, by setting
|
||||||
|
the `coverage_test` variable in `cmake`
|
||||||
|
|
||||||
|
The default coverage report format is `html-details`, but the user
|
||||||
|
can override it to any of the formats listed in `Builds/CMake/CodeCoverage.cmake`
|
||||||
|
by setting the `coverage_format` variable in `cmake`. It is also possible
|
||||||
|
to generate more than one format at a time by setting the `coverage_extra_args`
|
||||||
|
variable in `cmake`. The specific command line used to run the `gcovr` tool will be
|
||||||
|
displayed if the `CODE_COVERAGE_VERBOSE` variable is set.
|
||||||
|
|
||||||
|
By default, the code coverage tool runs parallel unit tests with `--unittest-jobs`
|
||||||
|
set to the number of available CPU cores. This may cause spurious test
|
||||||
|
errors on Apple. Developers can override the number of unit test jobs with
|
||||||
|
the `coverage_test_parallelism` variable in `cmake`.
|
||||||
|
|
||||||
|
Example use with some cmake variables set:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd .build
|
||||||
|
conan install .. --output-folder . --build missing --settings build_type=Debug
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Debug -Dcoverage=ON -Dxrpld=ON -Dtests=ON -Dcoverage_test_parallelism=2 -Dcoverage_format=html-details -Dcoverage_extra_args="--json coverage.json" -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake ..
|
||||||
|
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
|
||||||
|
- directory named `coverage`, with the `index.html` and other files inside, for the `html-details` or `html-nested` report formats.
|
||||||
|
|
||||||
|
|
||||||
## Options
|
## Options
|
||||||
|
|
||||||
| Option | Default Value | Description |
|
| Option | Default Value | Description |
|
||||||
| --- | ---| ---|
|
| --- | ---| ---|
|
||||||
| `assert` | OFF | Enable assertions.
|
| `assert` | OFF | Enable assertions.
|
||||||
| `reporting` | OFF | Build the reporting mode feature. |
|
| `coverage` | OFF | Prepare the coverage report. |
|
||||||
| `tests` | ON | Build tests. |
|
|
||||||
| `unity` | ON | Configure a unity build. |
|
|
||||||
| `san` | N/A | Enable a sanitizer with Clang. Choices are `thread` and `address`. |
|
| `san` | N/A | Enable a sanitizer with Clang. Choices are `thread` and `address`. |
|
||||||
|
| `tests` | OFF | Build tests. |
|
||||||
|
| `unity` | ON | Configure a unity build. |
|
||||||
|
| `xrpld` | OFF | Build the xrpld (`rippled`) application, and not just the libxrpl library. |
|
||||||
|
|
||||||
[Unity builds][5] may be faster for the first build
|
[Unity builds][5] may be faster for the first build
|
||||||
(at the cost of much more memory) since they concatenate sources into fewer
|
(at the cost of much more memory) since they concatenate sources into fewer
|
||||||
@@ -293,6 +408,23 @@ After any updates or changes to dependencies, you may need to do the following:
|
|||||||
4. Re-run [conan install](#build-and-test).
|
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
|
||||||
|
10 | #include <google/protobuf/port_def.inc>
|
||||||
|
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
1 error generated.
|
||||||
|
```
|
||||||
|
|
||||||
|
For example, if you want to build Debug:
|
||||||
|
|
||||||
|
1. For conan install, pass `--settings build_type=Debug`
|
||||||
|
2. For cmake, pass `-DCMAKE_BUILD_TYPE=Debug`
|
||||||
|
|
||||||
|
|
||||||
### no std::result_of
|
### no std::result_of
|
||||||
|
|
||||||
If your compiler version is recent enough to have removed `std::result_of` as
|
If your compiler version is recent enough to have removed `std::result_of` as
|
||||||
@@ -362,12 +494,7 @@ If you want to experiment with a new package, follow these steps:
|
|||||||
[5]: https://en.wikipedia.org/wiki/Unity_build
|
[5]: https://en.wikipedia.org/wiki/Unity_build
|
||||||
[6]: https://github.com/boostorg/beast/issues/2648
|
[6]: https://github.com/boostorg/beast/issues/2648
|
||||||
[7]: https://github.com/boostorg/beast/issues/2661
|
[7]: https://github.com/boostorg/beast/issues/2661
|
||||||
|
[gcovr]: https://gcovr.com/en/stable/getting-started.html
|
||||||
|
[python-pip]: https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/
|
||||||
[build_type]: https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html
|
[build_type]: https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html
|
||||||
[runtime]: https://cmake.org/cmake/help/latest/variable/CMAKE_MSVC_RUNTIME_LIBRARY.html
|
|
||||||
[toolchain]: https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html
|
|
||||||
[pcf]: https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#package-configuration-file
|
|
||||||
[pvf]: https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#package-version-file
|
|
||||||
[find_package]: https://cmake.org/cmake/help/latest/command/find_package.html
|
|
||||||
[search]: https://cmake.org/cmake/help/latest/command/find_package.html#search-procedure
|
|
||||||
[prefix_path]: https://cmake.org/cmake/help/latest/variable/CMAKE_PREFIX_PATH.html
|
|
||||||
[profile]: https://docs.conan.io/en/latest/reference/profiles.html
|
[profile]: https://docs.conan.io/en/latest/reference/profiles.html
|
||||||
|
|||||||
@@ -1,207 +0,0 @@
|
|||||||
|
|
||||||
macro(group_sources_in source_dir curdir)
|
|
||||||
file(GLOB children RELATIVE ${source_dir}/${curdir}
|
|
||||||
${source_dir}/${curdir}/*)
|
|
||||||
foreach (child ${children})
|
|
||||||
if (IS_DIRECTORY ${source_dir}/${curdir}/${child})
|
|
||||||
group_sources_in(${source_dir} ${curdir}/${child})
|
|
||||||
else()
|
|
||||||
string(REPLACE "/" "\\" groupname ${curdir})
|
|
||||||
source_group(${groupname} FILES
|
|
||||||
${source_dir}/${curdir}/${child})
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
macro(group_sources curdir)
|
|
||||||
group_sources_in(${PROJECT_SOURCE_DIR} ${curdir})
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
macro (exclude_from_default target_)
|
|
||||||
set_target_properties (${target_} PROPERTIES EXCLUDE_FROM_ALL ON)
|
|
||||||
set_target_properties (${target_} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON)
|
|
||||||
endmacro ()
|
|
||||||
|
|
||||||
macro (exclude_if_included target_)
|
|
||||||
get_directory_property(has_parent PARENT_DIRECTORY)
|
|
||||||
if (has_parent)
|
|
||||||
exclude_from_default (${target_})
|
|
||||||
endif ()
|
|
||||||
endmacro ()
|
|
||||||
|
|
||||||
function (print_ep_logs _target)
|
|
||||||
ExternalProject_Get_Property (${_target} STAMP_DIR)
|
|
||||||
add_custom_command(TARGET ${_target} POST_BUILD
|
|
||||||
COMMENT "${_target} BUILD OUTPUT"
|
|
||||||
COMMAND ${CMAKE_COMMAND}
|
|
||||||
-DIN_FILE=${STAMP_DIR}/${_target}-build-out.log
|
|
||||||
-P ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/echo_file.cmake
|
|
||||||
COMMAND ${CMAKE_COMMAND}
|
|
||||||
-DIN_FILE=${STAMP_DIR}/${_target}-build-err.log
|
|
||||||
-P ${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake/echo_file.cmake)
|
|
||||||
endfunction ()
|
|
||||||
|
|
||||||
#[=========================================================[
|
|
||||||
This is a function override for one function in the
|
|
||||||
standard ExternalProject module. We want to change
|
|
||||||
the generated build script slightly to include printing
|
|
||||||
the build logs in the case of failure. Those modifications
|
|
||||||
have been made here. This function override could break
|
|
||||||
in the future if the ExternalProject module changes internal
|
|
||||||
function names or changes the way it generates the build
|
|
||||||
scripts.
|
|
||||||
See:
|
|
||||||
https://gitlab.kitware.com/cmake/cmake/blob/df1ddeec128d68cc636f2dde6c2acd87af5658b6/Modules/ExternalProject.cmake#L1855-1952
|
|
||||||
#]=========================================================]
|
|
||||||
|
|
||||||
function(_ep_write_log_script name step cmd_var)
|
|
||||||
ExternalProject_Get_Property(${name} stamp_dir)
|
|
||||||
set(command "${${cmd_var}}")
|
|
||||||
|
|
||||||
set(make "")
|
|
||||||
set(code_cygpath_make "")
|
|
||||||
if(command MATCHES "^\\$\\(MAKE\\)")
|
|
||||||
# GNU make recognizes the string "$(MAKE)" as recursive make, so
|
|
||||||
# ensure that it appears directly in the makefile.
|
|
||||||
string(REGEX REPLACE "^\\$\\(MAKE\\)" "\${make}" command "${command}")
|
|
||||||
set(make "-Dmake=$(MAKE)")
|
|
||||||
|
|
||||||
if(WIN32 AND NOT CYGWIN)
|
|
||||||
set(code_cygpath_make "
|
|
||||||
if(\${make} MATCHES \"^/\")
|
|
||||||
execute_process(
|
|
||||||
COMMAND cygpath -w \${make}
|
|
||||||
OUTPUT_VARIABLE cygpath_make
|
|
||||||
ERROR_VARIABLE cygpath_make
|
|
||||||
RESULT_VARIABLE cygpath_error
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
if(NOT cygpath_error)
|
|
||||||
set(make \${cygpath_make})
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(config "")
|
|
||||||
if("${CMAKE_CFG_INTDIR}" MATCHES "^\\$")
|
|
||||||
string(REPLACE "${CMAKE_CFG_INTDIR}" "\${config}" command "${command}")
|
|
||||||
set(config "-Dconfig=${CMAKE_CFG_INTDIR}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Wrap multiple 'COMMAND' lines up into a second-level wrapper
|
|
||||||
# script so all output can be sent to one log file.
|
|
||||||
if(command MATCHES "(^|;)COMMAND;")
|
|
||||||
set(code_execute_process "
|
|
||||||
${code_cygpath_make}
|
|
||||||
execute_process(COMMAND \${command} RESULT_VARIABLE result)
|
|
||||||
if(result)
|
|
||||||
set(msg \"Command failed (\${result}):\\n\")
|
|
||||||
foreach(arg IN LISTS command)
|
|
||||||
set(msg \"\${msg} '\${arg}'\")
|
|
||||||
endforeach()
|
|
||||||
message(FATAL_ERROR \"\${msg}\")
|
|
||||||
endif()
|
|
||||||
")
|
|
||||||
set(code "")
|
|
||||||
set(cmd "")
|
|
||||||
set(sep "")
|
|
||||||
foreach(arg IN LISTS command)
|
|
||||||
if("x${arg}" STREQUAL "xCOMMAND")
|
|
||||||
if(NOT "x${cmd}" STREQUAL "x")
|
|
||||||
string(APPEND code "set(command \"${cmd}\")${code_execute_process}")
|
|
||||||
endif()
|
|
||||||
set(cmd "")
|
|
||||||
set(sep "")
|
|
||||||
else()
|
|
||||||
string(APPEND cmd "${sep}${arg}")
|
|
||||||
set(sep ";")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
string(APPEND code "set(command \"${cmd}\")${code_execute_process}")
|
|
||||||
file(GENERATE OUTPUT "${stamp_dir}/${name}-${step}-$<CONFIG>-impl.cmake" CONTENT "${code}")
|
|
||||||
set(command ${CMAKE_COMMAND} "-Dmake=\${make}" "-Dconfig=\${config}" -P ${stamp_dir}/${name}-${step}-$<CONFIG>-impl.cmake)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Wrap the command in a script to log output to files.
|
|
||||||
set(script ${stamp_dir}/${name}-${step}-$<CONFIG>.cmake)
|
|
||||||
set(logbase ${stamp_dir}/${name}-${step})
|
|
||||||
set(code "
|
|
||||||
${code_cygpath_make}
|
|
||||||
function (_echo_file _fil)
|
|
||||||
file (READ \${_fil} _cont)
|
|
||||||
execute_process (COMMAND \${CMAKE_COMMAND} -E echo \"\${_cont}\")
|
|
||||||
endfunction ()
|
|
||||||
set(command \"${command}\")
|
|
||||||
execute_process(
|
|
||||||
COMMAND \${command}
|
|
||||||
RESULT_VARIABLE result
|
|
||||||
OUTPUT_FILE \"${logbase}-out.log\"
|
|
||||||
ERROR_FILE \"${logbase}-err.log\"
|
|
||||||
)
|
|
||||||
if(result)
|
|
||||||
set(msg \"Command failed: \${result}\\n\")
|
|
||||||
foreach(arg IN LISTS command)
|
|
||||||
set(msg \"\${msg} '\${arg}'\")
|
|
||||||
endforeach()
|
|
||||||
execute_process (COMMAND \${CMAKE_COMMAND} -E echo \"Build output for ${logbase} : \")
|
|
||||||
_echo_file (\"${logbase}-out.log\")
|
|
||||||
_echo_file (\"${logbase}-err.log\")
|
|
||||||
set(msg \"\${msg}\\nSee above\\n\")
|
|
||||||
message(FATAL_ERROR \"\${msg}\")
|
|
||||||
else()
|
|
||||||
set(msg \"${name} ${step} command succeeded. See also ${logbase}-*.log\")
|
|
||||||
message(STATUS \"\${msg}\")
|
|
||||||
endif()
|
|
||||||
")
|
|
||||||
file(GENERATE OUTPUT "${script}" CONTENT "${code}")
|
|
||||||
set(command ${CMAKE_COMMAND} ${make} ${config} -P ${script})
|
|
||||||
set(${cmd_var} "${command}" PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
find_package(Git)
|
|
||||||
|
|
||||||
# function that calls git log to get current hash
|
|
||||||
function (git_hash hash_val)
|
|
||||||
# note: optional second extra string argument not in signature
|
|
||||||
if (NOT GIT_FOUND)
|
|
||||||
return ()
|
|
||||||
endif ()
|
|
||||||
set (_hash "")
|
|
||||||
set (_format "%H")
|
|
||||||
if (ARGC GREATER_EQUAL 2)
|
|
||||||
string (TOLOWER ${ARGV1} _short)
|
|
||||||
if (_short STREQUAL "short")
|
|
||||||
set (_format "%h")
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
execute_process (COMMAND ${GIT_EXECUTABLE} "log" "--pretty=${_format}" "-n1"
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
RESULT_VARIABLE _git_exit_code
|
|
||||||
OUTPUT_VARIABLE _temp_hash
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
ERROR_QUIET)
|
|
||||||
if (_git_exit_code EQUAL 0)
|
|
||||||
set (_hash ${_temp_hash})
|
|
||||||
endif ()
|
|
||||||
set (${hash_val} "${_hash}" PARENT_SCOPE)
|
|
||||||
endfunction ()
|
|
||||||
|
|
||||||
function (git_branch branch_val)
|
|
||||||
if (NOT GIT_FOUND)
|
|
||||||
return ()
|
|
||||||
endif ()
|
|
||||||
set (_branch "")
|
|
||||||
execute_process (COMMAND ${GIT_EXECUTABLE} "rev-parse" "--abbrev-ref" "HEAD"
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
RESULT_VARIABLE _git_exit_code
|
|
||||||
OUTPUT_VARIABLE _temp_branch
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
ERROR_QUIET)
|
|
||||||
if (_git_exit_code EQUAL 0)
|
|
||||||
set (_branch ${_temp_branch})
|
|
||||||
endif ()
|
|
||||||
set (${branch_val} "${_branch}" PARENT_SCOPE)
|
|
||||||
endfunction ()
|
|
||||||
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
|
|
||||||
#[=========================================================[
|
|
||||||
SQLITE doesn't provide build files in the
|
|
||||||
standard source-only distribution. So we wrote
|
|
||||||
a simple cmake file and we copy it to the
|
|
||||||
external project folder so that we can use
|
|
||||||
this file to build the lib with ExternalProject
|
|
||||||
#]=========================================================]
|
|
||||||
|
|
||||||
add_library (sqlite3 STATIC sqlite3.c)
|
|
||||||
#[=========================================================[
|
|
||||||
When compiled with SQLITE_THREADSAFE=1, SQLite operates
|
|
||||||
in serialized mode. In this mode, SQLite can be safely
|
|
||||||
used by multiple threads with no restriction.
|
|
||||||
|
|
||||||
NOTE: This implies a global mutex!
|
|
||||||
|
|
||||||
When compiled with SQLITE_THREADSAFE=2, SQLite can be
|
|
||||||
used in a multithreaded program so long as no two
|
|
||||||
threads attempt to use the same database connection at
|
|
||||||
the same time.
|
|
||||||
|
|
||||||
NOTE: This is the preferred threading model, but not
|
|
||||||
currently enabled because we need to investigate our
|
|
||||||
use-model and concurrency requirements.
|
|
||||||
|
|
||||||
TODO: consider whether any other options should be
|
|
||||||
used: https://www.sqlite.org/compile.html
|
|
||||||
#]=========================================================]
|
|
||||||
|
|
||||||
target_compile_definitions (sqlite3
|
|
||||||
PRIVATE
|
|
||||||
SQLITE_THREADSAFE=1
|
|
||||||
HAVE_USLEEP=1)
|
|
||||||
target_compile_options (sqlite3
|
|
||||||
PRIVATE
|
|
||||||
$<$<BOOL:${MSVC}>:
|
|
||||||
-wd4100
|
|
||||||
-wd4127
|
|
||||||
-wd4232
|
|
||||||
-wd4244
|
|
||||||
-wd4701
|
|
||||||
-wd4706
|
|
||||||
-wd4996
|
|
||||||
>
|
|
||||||
$<$<NOT:$<BOOL:${MSVC}>>:-Wno-array-bounds>)
|
|
||||||
install (
|
|
||||||
TARGETS
|
|
||||||
sqlite3
|
|
||||||
LIBRARY DESTINATION lib
|
|
||||||
ARCHIVE DESTINATION lib
|
|
||||||
RUNTIME DESTINATION bin
|
|
||||||
INCLUDES DESTINATION include)
|
|
||||||
install (
|
|
||||||
FILES
|
|
||||||
sqlite3.h
|
|
||||||
sqlite3ext.h
|
|
||||||
DESTINATION include)
|
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,98 +0,0 @@
|
|||||||
#[===================================================================[
|
|
||||||
coverage report target
|
|
||||||
#]===================================================================]
|
|
||||||
|
|
||||||
if (coverage)
|
|
||||||
if (is_clang)
|
|
||||||
if (APPLE)
|
|
||||||
execute_process (COMMAND xcrun -f llvm-profdata
|
|
||||||
OUTPUT_VARIABLE LLVM_PROFDATA
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
else ()
|
|
||||||
find_program (LLVM_PROFDATA llvm-profdata)
|
|
||||||
endif ()
|
|
||||||
if (NOT LLVM_PROFDATA)
|
|
||||||
message (WARNING "unable to find llvm-profdata - skipping coverage_report target")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (APPLE)
|
|
||||||
execute_process (COMMAND xcrun -f llvm-cov
|
|
||||||
OUTPUT_VARIABLE LLVM_COV
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
else ()
|
|
||||||
find_program (LLVM_COV llvm-cov)
|
|
||||||
endif ()
|
|
||||||
if (NOT LLVM_COV)
|
|
||||||
message (WARNING "unable to find llvm-cov - skipping coverage_report target")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set (extract_pattern "")
|
|
||||||
if (coverage_core_only)
|
|
||||||
set (extract_pattern "${CMAKE_CURRENT_SOURCE_DIR}/src/ripple/")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (LLVM_COV AND LLVM_PROFDATA)
|
|
||||||
add_custom_target (coverage_report
|
|
||||||
USES_TERMINAL
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "Generating coverage - results will be in ${CMAKE_BINARY_DIR}/coverage/index.html."
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "Running rippled tests."
|
|
||||||
COMMAND rippled --unittest$<$<BOOL:${coverage_test}>:=${coverage_test}> --quiet --unittest-log
|
|
||||||
COMMAND ${LLVM_PROFDATA}
|
|
||||||
merge -sparse default.profraw -o rip.profdata
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "Summary of coverage:"
|
|
||||||
COMMAND ${LLVM_COV}
|
|
||||||
report -instr-profile=rip.profdata
|
|
||||||
$<TARGET_FILE:rippled> ${extract_pattern}
|
|
||||||
# generate html report
|
|
||||||
COMMAND ${LLVM_COV}
|
|
||||||
show -format=html -output-dir=${CMAKE_BINARY_DIR}/coverage
|
|
||||||
-instr-profile=rip.profdata
|
|
||||||
$<TARGET_FILE:rippled> ${extract_pattern}
|
|
||||||
BYPRODUCTS coverage/index.html)
|
|
||||||
endif ()
|
|
||||||
elseif (is_gcc)
|
|
||||||
find_program (LCOV lcov)
|
|
||||||
if (NOT LCOV)
|
|
||||||
message (WARNING "unable to find lcov - skipping coverage_report target")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
find_program (GENHTML genhtml)
|
|
||||||
if (NOT GENHTML)
|
|
||||||
message (WARNING "unable to find genhtml - skipping coverage_report target")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
set (extract_pattern "*")
|
|
||||||
if (coverage_core_only)
|
|
||||||
set (extract_pattern "*/src/ripple/*")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (LCOV AND GENHTML)
|
|
||||||
add_custom_target (coverage_report
|
|
||||||
USES_TERMINAL
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "Generating coverage- results will be in ${CMAKE_BINARY_DIR}/coverage/index.html."
|
|
||||||
# create baseline info file
|
|
||||||
COMMAND ${LCOV}
|
|
||||||
--no-external -d "${CMAKE_CURRENT_SOURCE_DIR}" -c -d . -i -o baseline.info
|
|
||||||
| grep -v "ignoring data for external file"
|
|
||||||
# run tests
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "Running rippled tests for coverage report."
|
|
||||||
COMMAND rippled --unittest$<$<BOOL:${coverage_test}>:=${coverage_test}> --quiet --unittest-log
|
|
||||||
# Create test coverage data file
|
|
||||||
COMMAND ${LCOV}
|
|
||||||
--no-external -d "${CMAKE_CURRENT_SOURCE_DIR}" -c -d . -o tests.info
|
|
||||||
| grep -v "ignoring data for external file"
|
|
||||||
# Combine baseline and test coverage data
|
|
||||||
COMMAND ${LCOV}
|
|
||||||
-a baseline.info -a tests.info -o lcov-all.info
|
|
||||||
# extract our files
|
|
||||||
COMMAND ${LCOV}
|
|
||||||
-e lcov-all.info "${extract_pattern}" -o lcov.info
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "Summary of coverage:"
|
|
||||||
COMMAND ${LCOV} --summary lcov.info
|
|
||||||
# generate HTML report
|
|
||||||
COMMAND ${GENHTML}
|
|
||||||
-o ${CMAKE_BINARY_DIR}/coverage lcov.info
|
|
||||||
BYPRODUCTS coverage/index.html)
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
#[===================================================================[
|
|
||||||
multiconfig misc
|
|
||||||
#]===================================================================]
|
|
||||||
|
|
||||||
if (is_multiconfig)
|
|
||||||
# This code finds all source files in the src subdirectory for inclusion
|
|
||||||
# in the IDE file tree as non-compiled sources. Since this file list will
|
|
||||||
# have some overlap with files we have already added to our targets to
|
|
||||||
# be compiled, we explicitly remove any of these target source files from
|
|
||||||
# this list.
|
|
||||||
file (GLOB_RECURSE all_sources RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
CONFIGURE_DEPENDS
|
|
||||||
src/*.* Builds/*.md docs/*.md src/*.md Builds/*.cmake)
|
|
||||||
file(GLOB md_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS
|
|
||||||
*.md)
|
|
||||||
LIST(APPEND all_sources ${md_files})
|
|
||||||
foreach (_target secp256k1::secp256k1 ed25519::ed25519 xrpl_core rippled)
|
|
||||||
get_target_property (_type ${_target} TYPE)
|
|
||||||
if(_type STREQUAL "INTERFACE_LIBRARY")
|
|
||||||
continue()
|
|
||||||
endif()
|
|
||||||
get_target_property (_src ${_target} SOURCES)
|
|
||||||
list (REMOVE_ITEM all_sources ${_src})
|
|
||||||
endforeach ()
|
|
||||||
target_sources (rippled PRIVATE ${all_sources})
|
|
||||||
set_property (
|
|
||||||
SOURCE ${all_sources}
|
|
||||||
APPEND
|
|
||||||
PROPERTY HEADER_FILE_ONLY true)
|
|
||||||
if (MSVC)
|
|
||||||
set_property(
|
|
||||||
DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
PROPERTY VS_STARTUP_PROJECT rippled)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
group_sources(src)
|
|
||||||
group_sources(docs)
|
|
||||||
group_sources(Builds)
|
|
||||||
endif ()
|
|
||||||
@@ -1,180 +0,0 @@
|
|||||||
#[===================================================================[
|
|
||||||
package/container targets - (optional)
|
|
||||||
#]===================================================================]
|
|
||||||
|
|
||||||
if (is_root_project)
|
|
||||||
if (NOT DOCKER)
|
|
||||||
find_program (DOCKER docker)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (DOCKER)
|
|
||||||
# if no container label is provided, use current git hash
|
|
||||||
git_hash (commit_hash)
|
|
||||||
if (NOT container_label)
|
|
||||||
set (container_label ${commit_hash})
|
|
||||||
endif ()
|
|
||||||
message (STATUS "using [${container_label}] as build container tag...")
|
|
||||||
|
|
||||||
file (MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/packages)
|
|
||||||
|
|
||||||
#[===================================================================[
|
|
||||||
rpm
|
|
||||||
#]===================================================================]
|
|
||||||
add_custom_target (rpm_container
|
|
||||||
docker build
|
|
||||||
--pull
|
|
||||||
--build-arg GIT_COMMIT=${commit_hash}
|
|
||||||
-t rippleci/rippled-rpm-builder:${container_label}
|
|
||||||
$<$<BOOL:${rpm_cache_from}>:--cache-from=${rpm_cache_from}>
|
|
||||||
-f centos-builder/Dockerfile .
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Builds/containers
|
|
||||||
VERBATIM
|
|
||||||
USES_TERMINAL
|
|
||||||
COMMAND_EXPAND_LISTS
|
|
||||||
SOURCES
|
|
||||||
Builds/containers/centos-builder/Dockerfile
|
|
||||||
Builds/containers/centos-builder/centos_setup.sh
|
|
||||||
Builds/containers/shared/update-rippled.sh
|
|
||||||
Builds/containers/shared/update_sources.sh
|
|
||||||
Builds/containers/shared/rippled.service
|
|
||||||
Builds/containers/shared/rippled-reporting.service
|
|
||||||
Builds/containers/packaging/rpm/rippled.spec
|
|
||||||
Builds/containers/packaging/rpm/build_rpm.sh
|
|
||||||
Builds/containers/packaging/rpm/50-rippled.preset
|
|
||||||
Builds/containers/packaging/rpm/50-rippled-reporting.preset
|
|
||||||
bin/getRippledInfo
|
|
||||||
)
|
|
||||||
exclude_from_default (rpm_container)
|
|
||||||
add_custom_target (rpm
|
|
||||||
docker run
|
|
||||||
-v ${CMAKE_CURRENT_SOURCE_DIR}:/opt/rippled_bld/pkg/rippled
|
|
||||||
-v ${CMAKE_CURRENT_BINARY_DIR}/packages:/opt/rippled_bld/pkg/out
|
|
||||||
-t rippled-rpm-builder:${container_label}
|
|
||||||
/bin/bash -c "cp -fpu rippled/Builds/containers/packaging/rpm/build_rpm.sh . && ./build_rpm.sh"
|
|
||||||
VERBATIM
|
|
||||||
USES_TERMINAL
|
|
||||||
COMMAND_EXPAND_LISTS
|
|
||||||
SOURCES
|
|
||||||
Builds/containers/packaging/rpm/rippled.spec
|
|
||||||
)
|
|
||||||
exclude_from_default (rpm)
|
|
||||||
if (NOT have_package_container)
|
|
||||||
add_dependencies(rpm rpm_container)
|
|
||||||
endif ()
|
|
||||||
#[===================================================================[
|
|
||||||
dpkg
|
|
||||||
#]===================================================================]
|
|
||||||
# currently use ubuntu 18.04 as a base b/c it has one of
|
|
||||||
# the lower versions of libc among ubuntu and debian releases.
|
|
||||||
# we could change this in the future and build with some other deb
|
|
||||||
# based system.
|
|
||||||
add_custom_target (dpkg_container
|
|
||||||
docker build
|
|
||||||
--pull
|
|
||||||
--build-arg DIST_TAG=18.04
|
|
||||||
--build-arg GIT_COMMIT=${commit_hash}
|
|
||||||
-t rippled-dpkg-builder:${container_label}
|
|
||||||
$<$<BOOL:${dpkg_cache_from}>:--cache-from=${dpkg_cache_from}>
|
|
||||||
-f ubuntu-builder/Dockerfile .
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Builds/containers
|
|
||||||
VERBATIM
|
|
||||||
USES_TERMINAL
|
|
||||||
COMMAND_EXPAND_LISTS
|
|
||||||
SOURCES
|
|
||||||
Builds/containers/packaging/dpkg/debian/rippled-reporting.links
|
|
||||||
Builds/containers/packaging/dpkg/debian/copyright
|
|
||||||
Builds/containers/packaging/dpkg/debian/rules
|
|
||||||
Builds/containers/packaging/dpkg/debian/rippled-reporting.install
|
|
||||||
Builds/containers/packaging/dpkg/debian/rippled-reporting.postinst
|
|
||||||
Builds/containers/packaging/dpkg/debian/rippled.links
|
|
||||||
Builds/containers/packaging/dpkg/debian/rippled.prerm
|
|
||||||
Builds/containers/packaging/dpkg/debian/rippled.postinst
|
|
||||||
Builds/containers/packaging/dpkg/debian/rippled-dev.install
|
|
||||||
Builds/containers/packaging/dpkg/debian/dirs
|
|
||||||
Builds/containers/packaging/dpkg/debian/rippled.postrm
|
|
||||||
Builds/containers/packaging/dpkg/debian/rippled.conffiles
|
|
||||||
Builds/containers/packaging/dpkg/debian/compat
|
|
||||||
Builds/containers/packaging/dpkg/debian/source/format
|
|
||||||
Builds/containers/packaging/dpkg/debian/source/local-options
|
|
||||||
Builds/containers/packaging/dpkg/debian/README.Debian
|
|
||||||
Builds/containers/packaging/dpkg/debian/rippled.install
|
|
||||||
Builds/containers/packaging/dpkg/debian/rippled.preinst
|
|
||||||
Builds/containers/packaging/dpkg/debian/docs
|
|
||||||
Builds/containers/packaging/dpkg/debian/control
|
|
||||||
Builds/containers/packaging/dpkg/debian/rippled-reporting.dirs
|
|
||||||
Builds/containers/packaging/dpkg/build_dpkg.sh
|
|
||||||
Builds/containers/ubuntu-builder/Dockerfile
|
|
||||||
Builds/containers/ubuntu-builder/ubuntu_setup.sh
|
|
||||||
bin/getRippledInfo
|
|
||||||
Builds/containers/shared/install_cmake.sh
|
|
||||||
Builds/containers/shared/update-rippled.sh
|
|
||||||
Builds/containers/shared/update_sources.sh
|
|
||||||
Builds/containers/shared/rippled.service
|
|
||||||
Builds/containers/shared/rippled-reporting.service
|
|
||||||
Builds/containers/shared/rippled-logrotate
|
|
||||||
Builds/containers/shared/update-rippled-cron
|
|
||||||
)
|
|
||||||
exclude_from_default (dpkg_container)
|
|
||||||
add_custom_target (dpkg
|
|
||||||
docker run
|
|
||||||
-v ${CMAKE_CURRENT_SOURCE_DIR}:/opt/rippled_bld/pkg/rippled
|
|
||||||
-v ${CMAKE_CURRENT_BINARY_DIR}/packages:/opt/rippled_bld/pkg/out
|
|
||||||
-t rippled-dpkg-builder:${container_label}
|
|
||||||
/bin/bash -c "cp -fpu rippled/Builds/containers/packaging/dpkg/build_dpkg.sh . && ./build_dpkg.sh"
|
|
||||||
VERBATIM
|
|
||||||
USES_TERMINAL
|
|
||||||
COMMAND_EXPAND_LISTS
|
|
||||||
SOURCES
|
|
||||||
Builds/containers/packaging/dpkg/debian/control
|
|
||||||
)
|
|
||||||
exclude_from_default (dpkg)
|
|
||||||
if (NOT have_package_container)
|
|
||||||
add_dependencies(dpkg dpkg_container)
|
|
||||||
endif ()
|
|
||||||
#[===================================================================[
|
|
||||||
ci container
|
|
||||||
#]===================================================================]
|
|
||||||
# now use the same ubuntu image for our travis-ci docker images,
|
|
||||||
# but we use a newer distro (18.04 vs 16.04).
|
|
||||||
#
|
|
||||||
# the following steps assume the github pkg repo, but it's possible to
|
|
||||||
# adapt these for other docker hub repositories.
|
|
||||||
#
|
|
||||||
# steps for publishing a new CI image when you make changes:
|
|
||||||
#
|
|
||||||
# mkdir bld.ci && cd bld.ci && cmake -Dpackages_only=ON -Dcontainer_label=CI_LATEST
|
|
||||||
# cmake --build . --target ci_container --verbose
|
|
||||||
# docker tag rippled-ci-builder:CI_LATEST <HUB REPO PATH>/rippled-ci-builder:YYYY-MM-DD
|
|
||||||
# (NOTE: change YYYY-MM-DD to match current date, or use a different
|
|
||||||
# tag/version scheme if you prefer)
|
|
||||||
# docker push <HUB REPO PATH>/rippled-ci-builder:YYYY-MM-DD
|
|
||||||
# (NOTE: <HUB REPO PATH> is probably your user or org name if using
|
|
||||||
# docker hub, or it might be something like
|
|
||||||
# docker.pkg.github.com/ripple/rippled if using the github pkg
|
|
||||||
# registry. for any registry, you will need to be logged-in via
|
|
||||||
# docker and have push access.)
|
|
||||||
#
|
|
||||||
# ...then change the DOCKER_IMAGE line in .travis.yml :
|
|
||||||
# - DOCKER_IMAGE="<HUB REPO PATH>/rippled-ci-builder:YYYY-MM-DD"
|
|
||||||
add_custom_target (ci_container
|
|
||||||
docker build
|
|
||||||
--pull
|
|
||||||
--build-arg DIST_TAG=18.04
|
|
||||||
--build-arg GIT_COMMIT=${commit_hash}
|
|
||||||
--build-arg CI_USE=true
|
|
||||||
-t rippled-ci-builder:${container_label}
|
|
||||||
$<$<BOOL:${ci_cache_from}>:--cache-from=${ci_cache_from}>
|
|
||||||
-f ubuntu-builder/Dockerfile .
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/Builds/containers
|
|
||||||
VERBATIM
|
|
||||||
USES_TERMINAL
|
|
||||||
COMMAND_EXPAND_LISTS
|
|
||||||
SOURCES
|
|
||||||
Builds/containers/ubuntu-builder/Dockerfile
|
|
||||||
Builds/containers/ubuntu-builder/ubuntu_setup.sh
|
|
||||||
)
|
|
||||||
exclude_from_default (ci_container)
|
|
||||||
else ()
|
|
||||||
message (STATUS "docker NOT found -- won't be able to build containers for packaging")
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
#[===================================================================[
|
|
||||||
declare user options/settings
|
|
||||||
#]===================================================================]
|
|
||||||
|
|
||||||
option (assert "Enables asserts, even in release builds" OFF)
|
|
||||||
|
|
||||||
option (reporting "Build rippled with reporting mode enabled" OFF)
|
|
||||||
|
|
||||||
option (tests "Build tests" ON)
|
|
||||||
|
|
||||||
option (unity "Creates a build using UNITY support in cmake. This is the default" ON)
|
|
||||||
if (unity)
|
|
||||||
if (NOT is_ci)
|
|
||||||
set (CMAKE_UNITY_BUILD_BATCH_SIZE 15 CACHE STRING "")
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
if (is_gcc OR is_clang)
|
|
||||||
option (coverage "Generates coverage info." OFF)
|
|
||||||
option (profile "Add profiling flags" OFF)
|
|
||||||
set (coverage_test "" CACHE STRING
|
|
||||||
"On gcc & clang, the specific unit test(s) to run for coverage. Default is all tests.")
|
|
||||||
if (coverage_test AND NOT coverage)
|
|
||||||
set (coverage ON CACHE BOOL "gcc/clang only" FORCE)
|
|
||||||
endif ()
|
|
||||||
option (coverage_core_only
|
|
||||||
"Include only src/ripple files when generating coverage report. \
|
|
||||||
Set to OFF to include all sources in coverage report."
|
|
||||||
ON)
|
|
||||||
option (wextra "compile with extra gcc/clang warnings enabled" ON)
|
|
||||||
else ()
|
|
||||||
set (profile OFF CACHE BOOL "gcc/clang only" FORCE)
|
|
||||||
set (coverage OFF CACHE BOOL "gcc/clang only" FORCE)
|
|
||||||
set (wextra OFF CACHE BOOL "gcc/clang only" FORCE)
|
|
||||||
endif ()
|
|
||||||
if (is_linux)
|
|
||||||
option (BUILD_SHARED_LIBS "build shared ripple libraries" OFF)
|
|
||||||
option (static "link protobuf, openssl, libc++, and boost statically" ON)
|
|
||||||
option (perf "Enables flags that assist with perf recording" OFF)
|
|
||||||
option (use_gold "enables detection of gold (binutils) linker" ON)
|
|
||||||
option (use_mold "enables detection of mold (binutils) linker" ON)
|
|
||||||
else ()
|
|
||||||
# we are not ready to allow shared-libs on windows because it would require
|
|
||||||
# export declarations. On macos it's more feasible, but static openssl
|
|
||||||
# produces odd linker errors, thus we disable shared lib builds for now.
|
|
||||||
set (BUILD_SHARED_LIBS OFF CACHE BOOL "build shared ripple libraries - OFF for win/macos" FORCE)
|
|
||||||
set (static ON CACHE BOOL "static link, linux only. ON for WIN/macos" FORCE)
|
|
||||||
set (perf OFF CACHE BOOL "perf flags, linux only" FORCE)
|
|
||||||
set (use_gold OFF CACHE BOOL "gold linker, linux only" FORCE)
|
|
||||||
set (use_mold OFF CACHE BOOL "mold linker, linux only" FORCE)
|
|
||||||
endif ()
|
|
||||||
if (is_clang)
|
|
||||||
option (use_lld "enables detection of lld linker" ON)
|
|
||||||
else ()
|
|
||||||
set (use_lld OFF CACHE BOOL "try lld linker, clang only" FORCE)
|
|
||||||
endif ()
|
|
||||||
option (jemalloc "Enables jemalloc for heap profiling" OFF)
|
|
||||||
option (werr "treat warnings as errors" OFF)
|
|
||||||
option (local_protobuf
|
|
||||||
"Force a local build of protobuf instead of looking for an installed version." OFF)
|
|
||||||
option (local_grpc
|
|
||||||
"Force a local build of gRPC instead of looking for an installed version." OFF)
|
|
||||||
|
|
||||||
# this one is a string and therefore can't be an option
|
|
||||||
set (san "" CACHE STRING "On gcc & clang, add sanitizer instrumentation")
|
|
||||||
set_property (CACHE san PROPERTY STRINGS ";undefined;memory;address;thread")
|
|
||||||
if (san)
|
|
||||||
string (TOLOWER ${san} san)
|
|
||||||
set (SAN_FLAG "-fsanitize=${san}")
|
|
||||||
set (SAN_LIB "")
|
|
||||||
if (is_gcc)
|
|
||||||
if (san STREQUAL "address")
|
|
||||||
set (SAN_LIB "asan")
|
|
||||||
elseif (san STREQUAL "thread")
|
|
||||||
set (SAN_LIB "tsan")
|
|
||||||
elseif (san STREQUAL "memory")
|
|
||||||
set (SAN_LIB "msan")
|
|
||||||
elseif (san STREQUAL "undefined")
|
|
||||||
set (SAN_LIB "ubsan")
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
set (_saved_CRL ${CMAKE_REQUIRED_LIBRARIES})
|
|
||||||
set (CMAKE_REQUIRED_LIBRARIES "${SAN_FLAG};${SAN_LIB}")
|
|
||||||
check_cxx_compiler_flag (${SAN_FLAG} COMPILER_SUPPORTS_SAN)
|
|
||||||
set (CMAKE_REQUIRED_LIBRARIES ${_saved_CRL})
|
|
||||||
if (NOT COMPILER_SUPPORTS_SAN)
|
|
||||||
message (FATAL_ERROR "${san} sanitizer does not seem to be supported by your compiler")
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
set (container_label "" CACHE STRING "tag to use for package building containers")
|
|
||||||
option (packages_only
|
|
||||||
"ONLY generate package building targets. This is special use-case and almost \
|
|
||||||
certainly not what you want. Use with caution as you won't be able to build \
|
|
||||||
any compiled targets locally." OFF)
|
|
||||||
option (have_package_container
|
|
||||||
"Sometimes you already have the tagged container you want to use for package \
|
|
||||||
building and you don't want docker to rebuild it. This flag will detach the \
|
|
||||||
dependency of the package build from the container build. It's an advanced \
|
|
||||||
use case and most likely you should not be touching this flag." OFF)
|
|
||||||
|
|
||||||
# the remaining options are obscure and rarely used
|
|
||||||
option (beast_no_unit_test_inline
|
|
||||||
"Prevents unit test definitions from being inserted into global table"
|
|
||||||
OFF)
|
|
||||||
option (single_io_service_thread
|
|
||||||
"Restricts the number of threads calling io_service::run to one. \
|
|
||||||
This can be useful when debugging."
|
|
||||||
OFF)
|
|
||||||
option (boost_show_deprecated
|
|
||||||
"Allow boost to fail on deprecated usage. Only useful if you're trying\
|
|
||||||
to find deprecated calls."
|
|
||||||
OFF)
|
|
||||||
option (beast_hashers
|
|
||||||
"Use local implementations for sha/ripemd hashes (experimental, not recommended)"
|
|
||||||
OFF)
|
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
option (beast_disable_autolink "Disables autolinking of system libraries on WIN32" OFF)
|
|
||||||
else ()
|
|
||||||
set (beast_disable_autolink OFF CACHE BOOL "WIN32 only" FORCE)
|
|
||||||
endif ()
|
|
||||||
if (coverage)
|
|
||||||
message (STATUS "coverage build requested - forcing Debug build")
|
|
||||||
set (CMAKE_BUILD_TYPE Debug CACHE STRING "build type" FORCE)
|
|
||||||
endif ()
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#[===================================================================[
|
|
||||||
read version from source
|
|
||||||
#]===================================================================]
|
|
||||||
|
|
||||||
file (STRINGS src/ripple/protocol/impl/BuildInfo.cpp BUILD_INFO)
|
|
||||||
foreach (line_ ${BUILD_INFO})
|
|
||||||
if (line_ MATCHES "versionString[ ]*=[ ]*\"(.+)\"")
|
|
||||||
set (rippled_version ${CMAKE_MATCH_1})
|
|
||||||
endif ()
|
|
||||||
endforeach ()
|
|
||||||
if (rippled_version)
|
|
||||||
message (STATUS "rippled version: ${rippled_version}")
|
|
||||||
else ()
|
|
||||||
message (FATAL_ERROR "unable to determine rippled version")
|
|
||||||
endif ()
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
################################################################################
|
|
||||||
# SociConfig.cmake - CMake build configuration of SOCI library
|
|
||||||
################################################################################
|
|
||||||
# Copyright (C) 2010 Mateusz Loskot <mateusz@loskot.net>
|
|
||||||
#
|
|
||||||
# Distributed under the Boost Software License, Version 1.0.
|
|
||||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
# http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
include(CheckCXXSymbolExists)
|
|
||||||
|
|
||||||
if(WIN32)
|
|
||||||
check_cxx_symbol_exists("_M_AMD64" "" SOCI_TARGET_ARCH_X64)
|
|
||||||
if(NOT RTC_ARCH_X64)
|
|
||||||
check_cxx_symbol_exists("_M_IX86" "" SOCI_TARGET_ARCH_X86)
|
|
||||||
endif(NOT RTC_ARCH_X64)
|
|
||||||
# add check for arm here
|
|
||||||
# see http://msdn.microsoft.com/en-us/library/b0084kay.aspx
|
|
||||||
else(WIN32)
|
|
||||||
check_cxx_symbol_exists("__i386__" "" SOCI_TARGET_ARCH_X86)
|
|
||||||
check_cxx_symbol_exists("__x86_64__" "" SOCI_TARGET_ARCH_X64)
|
|
||||||
check_cxx_symbol_exists("__arm__" "" SOCI_TARGET_ARCH_ARM)
|
|
||||||
endif(WIN32)
|
|
||||||
|
|
||||||
if(NOT DEFINED LIB_SUFFIX)
|
|
||||||
if(SOCI_TARGET_ARCH_X64)
|
|
||||||
set(_lib_suffix "64")
|
|
||||||
else()
|
|
||||||
set(_lib_suffix "")
|
|
||||||
endif()
|
|
||||||
set(LIB_SUFFIX ${_lib_suffix} CACHE STRING "Specifies suffix for the lib directory")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#
|
|
||||||
# C++11 Option
|
|
||||||
#
|
|
||||||
|
|
||||||
if(NOT SOCI_CXX_C11)
|
|
||||||
set (SOCI_CXX_C11 OFF CACHE BOOL "Build to the C++11 standard")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#
|
|
||||||
# Force compilation flags and set desired warnings level
|
|
||||||
#
|
|
||||||
|
|
||||||
if (MSVC)
|
|
||||||
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
|
||||||
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
|
||||||
add_definitions(-D_CRT_NONSTDC_NO_WARNING)
|
|
||||||
add_definitions(-D_SCL_SECURE_NO_WARNINGS)
|
|
||||||
|
|
||||||
if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
|
|
||||||
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
||||||
else()
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /we4266")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
else()
|
|
||||||
|
|
||||||
set(SOCI_GCC_CLANG_COMMON_FLAGS "")
|
|
||||||
# "-pedantic -Werror -Wno-error=parentheses -Wall -Wextra -Wpointer-arith -Wcast-align -Wcast-qual -Wfloat-equal -Woverloaded-virtual -Wredundant-decls -Wno-long-long")
|
|
||||||
|
|
||||||
|
|
||||||
if (SOCI_CXX_C11)
|
|
||||||
set(SOCI_CXX_VERSION_FLAGS "-std=c++11")
|
|
||||||
else()
|
|
||||||
set(SOCI_CXX_VERSION_FLAGS "-std=gnu++98")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER}" MATCHES "clang")
|
|
||||||
|
|
||||||
if(NOT CMAKE_CXX_COMPILER_VERSION LESS 3.1 AND SOCI_ASAN)
|
|
||||||
set(SOCI_GCC_CLANG_COMMON_FLAGS "${SOCI_GCC_CLANG_COMMON_FLAGS} -fsanitize=address")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# enforce C++11 for Clang
|
|
||||||
set(SOCI_CXX_C11 ON)
|
|
||||||
set(SOCI_CXX_VERSION_FLAGS "-std=c++11")
|
|
||||||
add_definitions(-DCATCH_CONFIG_CPP11_NO_IS_ENUM)
|
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SOCI_GCC_CLANG_COMMON_FLAGS} ${SOCI_CXX_VERSION_FLAGS}")
|
|
||||||
|
|
||||||
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
|
|
||||||
|
|
||||||
if(NOT CMAKE_CXX_COMPILER_VERSION LESS 4.8 AND SOCI_ASAN)
|
|
||||||
set(SOCI_GCC_CLANG_COMMON_FLAGS "${SOCI_GCC_CLANG_COMMON_FLAGS} -fsanitize=address")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SOCI_GCC_CLANG_COMMON_FLAGS} ${SOCI_CXX_VERSION_FLAGS} ")
|
|
||||||
if (CMAKE_COMPILER_IS_GNUCXX)
|
|
||||||
if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
||||||
else()
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-variadic-macros")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
else()
|
|
||||||
message(WARNING "Unknown toolset - using default flags to build SOCI")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Set SOCI_HAVE_* variables for soci-config.h generator
|
|
||||||
set(SOCI_HAVE_CXX_C11 ${SOCI_CXX_C11} CACHE INTERNAL "Enables C++11 support")
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
find_package(Protobuf 3.8)
|
|
||||||
|
|
||||||
set(output_dir ${CMAKE_BINARY_DIR}/proto_gen)
|
|
||||||
file(MAKE_DIRECTORY ${output_dir})
|
|
||||||
set(ccbd ${CMAKE_CURRENT_BINARY_DIR})
|
|
||||||
set(CMAKE_CURRENT_BINARY_DIR ${output_dir})
|
|
||||||
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS src/ripple/proto/ripple.proto)
|
|
||||||
set(CMAKE_CURRENT_BINARY_DIR ${ccbd})
|
|
||||||
|
|
||||||
target_include_directories(xrpl_core SYSTEM PUBLIC
|
|
||||||
# The generated implementation imports the header relative to the output
|
|
||||||
# directory.
|
|
||||||
$<BUILD_INTERFACE:${output_dir}>
|
|
||||||
$<BUILD_INTERFACE:${output_dir}/src>
|
|
||||||
)
|
|
||||||
target_sources(xrpl_core PRIVATE ${output_dir}/src/ripple/proto/ripple.pb.cc)
|
|
||||||
install(
|
|
||||||
FILES ${output_dir}/src/ripple/proto/ripple.pb.h
|
|
||||||
DESTINATION include/ripple/proto)
|
|
||||||
target_link_libraries(xrpl_core PUBLIC protobuf::libprotobuf)
|
|
||||||
target_compile_options(xrpl_core
|
|
||||||
PUBLIC
|
|
||||||
$<$<BOOL:${XCODE}>:
|
|
||||||
--system-header-prefix="google/protobuf"
|
|
||||||
-Wno-deprecated-dynamic-exception-spec
|
|
||||||
>
|
|
||||||
)
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
find_package(gRPC 1.23)
|
|
||||||
|
|
||||||
#[=================================[
|
|
||||||
generate protobuf sources for
|
|
||||||
grpc defs and bundle into a
|
|
||||||
static lib
|
|
||||||
#]=================================]
|
|
||||||
set(output_dir "${CMAKE_BINARY_DIR}/proto_gen_grpc")
|
|
||||||
set(GRPC_GEN_DIR "${output_dir}/ripple/proto")
|
|
||||||
file(MAKE_DIRECTORY ${GRPC_GEN_DIR})
|
|
||||||
set(GRPC_PROTO_SRCS)
|
|
||||||
set(GRPC_PROTO_HDRS)
|
|
||||||
set(GRPC_PROTO_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/src/ripple/proto/org")
|
|
||||||
file(GLOB_RECURSE GRPC_DEFINITION_FILES "${GRPC_PROTO_ROOT}/*.proto")
|
|
||||||
foreach(file ${GRPC_DEFINITION_FILES})
|
|
||||||
# /home/user/rippled/src/ripple/proto/org/.../v1/get_ledger.proto
|
|
||||||
get_filename_component(_abs_file ${file} ABSOLUTE)
|
|
||||||
# /home/user/rippled/src/ripple/proto/org/.../v1
|
|
||||||
get_filename_component(_abs_dir ${_abs_file} DIRECTORY)
|
|
||||||
# get_ledger
|
|
||||||
get_filename_component(_basename ${file} NAME_WE)
|
|
||||||
# /home/user/rippled/src/ripple/proto
|
|
||||||
get_filename_component(_proto_inc ${GRPC_PROTO_ROOT} DIRECTORY) # updir one level
|
|
||||||
# org/.../v1/get_ledger.proto
|
|
||||||
file(RELATIVE_PATH _rel_root_file ${_proto_inc} ${_abs_file})
|
|
||||||
# org/.../v1
|
|
||||||
get_filename_component(_rel_root_dir ${_rel_root_file} DIRECTORY)
|
|
||||||
# src/ripple/proto/org/.../v1
|
|
||||||
file(RELATIVE_PATH _rel_dir ${CMAKE_CURRENT_SOURCE_DIR} ${_abs_dir})
|
|
||||||
|
|
||||||
# .cmake/proto_gen_grpc/ripple/proto/org/.../v1/get_ledger.grpc.pb.cc
|
|
||||||
set(src_1 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.grpc.pb.cc")
|
|
||||||
set(src_2 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.pb.cc")
|
|
||||||
set(hdr_1 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.grpc.pb.h")
|
|
||||||
set(hdr_2 "${GRPC_GEN_DIR}/${_rel_root_dir}/${_basename}.pb.h")
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${src_1} ${src_2} ${hdr_1} ${hdr_2}
|
|
||||||
COMMAND protobuf::protoc
|
|
||||||
ARGS --grpc_out=${GRPC_GEN_DIR}
|
|
||||||
--cpp_out=${GRPC_GEN_DIR}
|
|
||||||
--plugin=protoc-gen-grpc=$<TARGET_FILE:gRPC::grpc_cpp_plugin>
|
|
||||||
-I ${_proto_inc} -I ${_rel_dir}
|
|
||||||
${_abs_file}
|
|
||||||
DEPENDS ${_abs_file} protobuf::protoc gRPC::grpc_cpp_plugin
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
||||||
COMMENT "Running gRPC C++ protocol buffer compiler on ${file}"
|
|
||||||
VERBATIM)
|
|
||||||
set_source_files_properties(${src_1} ${src_2} ${hdr_1} ${hdr_2} PROPERTIES
|
|
||||||
GENERATED TRUE
|
|
||||||
SKIP_UNITY_BUILD_INCLUSION ON
|
|
||||||
)
|
|
||||||
list(APPEND GRPC_PROTO_SRCS ${src_1} ${src_2})
|
|
||||||
list(APPEND GRPC_PROTO_HDRS ${hdr_1} ${hdr_2})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
target_include_directories(xrpl_core SYSTEM PUBLIC
|
|
||||||
$<BUILD_INTERFACE:${output_dir}>
|
|
||||||
$<BUILD_INTERFACE:${output_dir}/ripple/proto>
|
|
||||||
# The generated sources include headers relative to this path. Fix it later.
|
|
||||||
$<INSTALL_INTERFACE:include/ripple/proto>
|
|
||||||
)
|
|
||||||
target_sources(xrpl_core PRIVATE ${GRPC_PROTO_SRCS})
|
|
||||||
install(
|
|
||||||
DIRECTORY ${output_dir}/ripple
|
|
||||||
DESTINATION include/
|
|
||||||
FILES_MATCHING PATTERN "*.h"
|
|
||||||
)
|
|
||||||
target_link_libraries(xrpl_core PUBLIC
|
|
||||||
"gRPC::grpc++"
|
|
||||||
# libgrpc is missing references.
|
|
||||||
absl::random_random
|
|
||||||
)
|
|
||||||
target_compile_options(xrpl_core
|
|
||||||
PRIVATE
|
|
||||||
$<$<BOOL:${MSVC}>:-wd4065>
|
|
||||||
$<$<NOT:$<BOOL:${MSVC}>>:-Wno-deprecated-declarations>
|
|
||||||
PUBLIC
|
|
||||||
$<$<BOOL:${MSVC}>:-wd4996>
|
|
||||||
$<$<BOOL:${XCODE}>:
|
|
||||||
--system-header-prefix="google/protobuf"
|
|
||||||
-Wno-deprecated-dynamic-exception-spec
|
|
||||||
>)
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#[=========================================================[
|
|
||||||
This is a CMake script file that is used to write
|
|
||||||
the contents of a file to stdout (using the cmake
|
|
||||||
echo command). The input file is passed via the
|
|
||||||
IN_FILE variable.
|
|
||||||
#]=========================================================]
|
|
||||||
|
|
||||||
if (EXISTS ${IN_FILE})
|
|
||||||
file (READ ${IN_FILE} contents)
|
|
||||||
## only print files that actually have some text in them
|
|
||||||
if (contents MATCHES "[a-z0-9A-Z]+")
|
|
||||||
execute_process(
|
|
||||||
COMMAND
|
|
||||||
${CMAKE_COMMAND} -E echo "${contents}")
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
[Please see the BUILD instructions here](../BUILD.md)
|
|
||||||
405
Builds/Test.py
405
Builds/Test.py
@@ -1,405 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
# This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
# Copyright (c) 2012 - 2017 Ripple Labs Inc.
|
|
||||||
#
|
|
||||||
# Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
# purpose with or without fee is hereby granted, provided that the above
|
|
||||||
# copyright notice and this permission notice appear in all copies.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
# ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
|
|
||||||
"""
|
|
||||||
Invocation:
|
|
||||||
|
|
||||||
./Builds/Test.py - builds and tests all configurations
|
|
||||||
|
|
||||||
The build must succeed without shell aliases for this to work.
|
|
||||||
|
|
||||||
To pass flags to cmake, put them at the very end of the command line, after
|
|
||||||
the -- flag - like this:
|
|
||||||
|
|
||||||
./Builds/Test.py -- -j4 # Pass -j4 to cmake --build
|
|
||||||
|
|
||||||
|
|
||||||
Common problems:
|
|
||||||
|
|
||||||
1) Boost not found. Solution: export BOOST_ROOT=[path to boost folder]
|
|
||||||
|
|
||||||
2) OpenSSL not found. Solution: export OPENSSL_ROOT=[path to OpenSSL folder]
|
|
||||||
|
|
||||||
3) cmake is not found. Solution: Be sure cmake directory is on your $PATH
|
|
||||||
|
|
||||||
"""
|
|
||||||
from __future__ import absolute_import, division, print_function, unicode_literals
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import itertools
|
|
||||||
import os
|
|
||||||
import platform
|
|
||||||
import re
|
|
||||||
import shutil
|
|
||||||
import sys
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
|
|
||||||
def powerset(iterable):
|
|
||||||
"""powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"""
|
|
||||||
s = list(iterable)
|
|
||||||
return itertools.chain.from_iterable(itertools.combinations(s, r) for r in range(len(s) + 1))
|
|
||||||
|
|
||||||
IS_WINDOWS = platform.system().lower() == 'windows'
|
|
||||||
IS_OS_X = platform.system().lower() == 'darwin'
|
|
||||||
|
|
||||||
# CMake
|
|
||||||
if IS_WINDOWS:
|
|
||||||
CMAKE_UNITY_CONFIGS = ['Debug', 'Release']
|
|
||||||
CMAKE_NONUNITY_CONFIGS = ['Debug', 'Release']
|
|
||||||
else:
|
|
||||||
CMAKE_UNITY_CONFIGS = []
|
|
||||||
CMAKE_NONUNITY_CONFIGS = []
|
|
||||||
CMAKE_UNITY_COMBOS = { '' : [['rippled'], CMAKE_UNITY_CONFIGS],
|
|
||||||
'.nounity' : [['rippled'], CMAKE_NONUNITY_CONFIGS] }
|
|
||||||
|
|
||||||
if IS_WINDOWS:
|
|
||||||
CMAKE_DIR_TARGETS = { ('msvc' + unity,) : targets for unity, targets in
|
|
||||||
CMAKE_UNITY_COMBOS.items() }
|
|
||||||
elif IS_OS_X:
|
|
||||||
CMAKE_DIR_TARGETS = { (build + unity,) : targets
|
|
||||||
for build in ['debug', 'release']
|
|
||||||
for unity, targets in CMAKE_UNITY_COMBOS.items() }
|
|
||||||
else:
|
|
||||||
CMAKE_DIR_TARGETS = { (cc + "." + build + unity,) : targets
|
|
||||||
for cc in ['gcc', 'clang']
|
|
||||||
for build in ['debug', 'release', 'coverage', 'profile']
|
|
||||||
for unity, targets in CMAKE_UNITY_COMBOS.items() }
|
|
||||||
|
|
||||||
# list of tuples of all possible options
|
|
||||||
if IS_WINDOWS or IS_OS_X:
|
|
||||||
CMAKE_ALL_GENERATE_OPTIONS = [tuple(x) for x in powerset(['-GNinja', '-Dassert=true'])]
|
|
||||||
else:
|
|
||||||
CMAKE_ALL_GENERATE_OPTIONS = list(set(
|
|
||||||
[tuple(x) for x in powerset(['-GNinja', '-Dstatic=true', '-Dassert=true', '-Dsan=address'])] +
|
|
||||||
[tuple(x) for x in powerset(['-GNinja', '-Dstatic=true', '-Dassert=true', '-Dsan=thread'])]))
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description='Test.py - run ripple tests'
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--all', '-a',
|
|
||||||
action='store_true',
|
|
||||||
help='Build all configurations.',
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--keep_going', '-k',
|
|
||||||
action='store_true',
|
|
||||||
help='Keep going after one configuration has failed.',
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--silent', '-s',
|
|
||||||
action='store_true',
|
|
||||||
help='Silence all messages except errors',
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--verbose', '-v',
|
|
||||||
action='store_true',
|
|
||||||
help=('Report more information about which commands are executed and the '
|
|
||||||
'results.'),
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--test', '-t',
|
|
||||||
default='',
|
|
||||||
help='Add a prefix for unit tests',
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--testjobs',
|
|
||||||
default='0',
|
|
||||||
type=int,
|
|
||||||
help='Run tests in parallel'
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--ipv6',
|
|
||||||
action='store_true',
|
|
||||||
help='Use IPv6 localhost when running unit tests.',
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--clean', '-c',
|
|
||||||
action='store_true',
|
|
||||||
help='delete all build artifacts after testing',
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--quiet', '-q',
|
|
||||||
action='store_true',
|
|
||||||
help='Reduce output where possible (unit tests)',
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--dir', '-d',
|
|
||||||
default=(),
|
|
||||||
nargs='*',
|
|
||||||
help='Specify one or more CMake dir names. '
|
|
||||||
'Will also be used as -Dtarget=<dir> running cmake.'
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--target',
|
|
||||||
default=(),
|
|
||||||
nargs='*',
|
|
||||||
help='Specify one or more CMake build targets. '
|
|
||||||
'Will be used as --target <target> running cmake --build.'
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--config',
|
|
||||||
default=(),
|
|
||||||
nargs='*',
|
|
||||||
help='Specify one or more CMake build configs. '
|
|
||||||
'Will be used as --config <config> running cmake --build.'
|
|
||||||
)
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--generator_option',
|
|
||||||
action='append',
|
|
||||||
help='Specify a CMake generator option. Repeat for multiple options. '
|
|
||||||
'Will be passed to the cmake generator. '
|
|
||||||
'Due to limits of the argument parser, arguments starting with \'-\' '
|
|
||||||
'must be attached to this option. e.g. --generator_option=-GNinja.')
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'--build_option',
|
|
||||||
action='append',
|
|
||||||
help='Specify a build option. Repeat for multiple options. '
|
|
||||||
'Will be passed to the build tool via cmake --build. '
|
|
||||||
'Due to limits of the argument parser, arguments starting with \'-\' '
|
|
||||||
'must be attached to this option. e.g. --build_option=-j8.')
|
|
||||||
|
|
||||||
parser.add_argument(
|
|
||||||
'extra_args',
|
|
||||||
default=(),
|
|
||||||
nargs='*',
|
|
||||||
help='Extra arguments are passed through to the tools'
|
|
||||||
)
|
|
||||||
|
|
||||||
ARGS = parser.parse_args()
|
|
||||||
|
|
||||||
def decodeString(line):
|
|
||||||
# Python 2 vs. Python 3
|
|
||||||
if isinstance(line, str):
|
|
||||||
return line
|
|
||||||
else:
|
|
||||||
return line.decode()
|
|
||||||
|
|
||||||
def shell(cmd, args=(), silent=False, cust_env=None):
|
|
||||||
""""Execute a shell command and return the output."""
|
|
||||||
silent = ARGS.silent or silent
|
|
||||||
verbose = not silent and ARGS.verbose
|
|
||||||
if verbose:
|
|
||||||
print('$' + cmd, *args)
|
|
||||||
|
|
||||||
command = (cmd,) + args
|
|
||||||
|
|
||||||
# shell is needed in Windows to find executable in the path
|
|
||||||
process = subprocess.Popen(
|
|
||||||
command,
|
|
||||||
stdin=subprocess.PIPE,
|
|
||||||
stdout=subprocess.PIPE,
|
|
||||||
stderr=subprocess.STDOUT,
|
|
||||||
env=cust_env,
|
|
||||||
shell=IS_WINDOWS)
|
|
||||||
lines = []
|
|
||||||
count = 0
|
|
||||||
# readline returns '' at EOF
|
|
||||||
for line in iter(process.stdout.readline, ''):
|
|
||||||
if process.poll() is None:
|
|
||||||
decoded = decodeString(line)
|
|
||||||
lines.append(decoded)
|
|
||||||
if verbose:
|
|
||||||
print(decoded, end='')
|
|
||||||
elif not silent:
|
|
||||||
count += 1
|
|
||||||
if count >= 80:
|
|
||||||
print()
|
|
||||||
count = 0
|
|
||||||
else:
|
|
||||||
print('.', end='')
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
|
|
||||||
if not verbose and count:
|
|
||||||
print()
|
|
||||||
process.wait()
|
|
||||||
return process.returncode, lines
|
|
||||||
|
|
||||||
def get_cmake_dir(cmake_dir):
|
|
||||||
return os.path.join('build' , 'cmake' , cmake_dir)
|
|
||||||
|
|
||||||
def run_cmake(directory, cmake_dir, args):
|
|
||||||
print('Generating build in', directory, 'with', *args or ('default options',))
|
|
||||||
old_dir = os.getcwd()
|
|
||||||
if not os.path.exists(directory):
|
|
||||||
os.makedirs(directory)
|
|
||||||
os.chdir(directory)
|
|
||||||
if IS_WINDOWS and not any(arg.startswith("-G") for arg in args) and not os.path.exists("CMakeCache.txt"):
|
|
||||||
if '--ninja' in args:
|
|
||||||
args += ( '-GNinja', )
|
|
||||||
else:
|
|
||||||
args += ( '-GVisual Studio 14 2015 Win64', )
|
|
||||||
# hack to extract cmake options/args from the legacy target format
|
|
||||||
if re.search('\.unity', cmake_dir):
|
|
||||||
args += ( '-Dunity=ON', )
|
|
||||||
if re.search('\.nounity', cmake_dir):
|
|
||||||
args += ( '-Dunity=OFF', )
|
|
||||||
if re.search('coverage', cmake_dir):
|
|
||||||
args += ( '-Dcoverage=ON', )
|
|
||||||
if re.search('profile', cmake_dir):
|
|
||||||
args += ( '-Dprofile=ON', )
|
|
||||||
if re.search('debug', cmake_dir):
|
|
||||||
args += ( '-DCMAKE_BUILD_TYPE=Debug', )
|
|
||||||
if re.search('release', cmake_dir):
|
|
||||||
args += ( '-DCMAKE_BUILD_TYPE=Release', )
|
|
||||||
m = re.search('gcc(-[^.]*)', cmake_dir)
|
|
||||||
if m:
|
|
||||||
args += ( '-DCMAKE_C_COMPILER=' + m.group(0),
|
|
||||||
'-DCMAKE_CXX_COMPILER=g++' + m.group(1), )
|
|
||||||
elif re.search('gcc', cmake_dir):
|
|
||||||
args += ( '-DCMAKE_C_COMPILER=gcc', '-DCMAKE_CXX_COMPILER=g++', )
|
|
||||||
m = re.search('clang(-[^.]*)', cmake_dir)
|
|
||||||
if m:
|
|
||||||
args += ( '-DCMAKE_C_COMPILER=' + m.group(0),
|
|
||||||
'-DCMAKE_CXX_COMPILER=clang++' + m.group(1), )
|
|
||||||
elif re.search('clang', cmake_dir):
|
|
||||||
args += ( '-DCMAKE_C_COMPILER=clang', '-DCMAKE_CXX_COMPILER=clang++', )
|
|
||||||
|
|
||||||
args += ( os.path.join('..', '..', '..'), )
|
|
||||||
resultcode, lines = shell('cmake', args)
|
|
||||||
|
|
||||||
if resultcode:
|
|
||||||
print('Generating FAILED:')
|
|
||||||
if not ARGS.verbose:
|
|
||||||
print(*lines, sep='')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
os.chdir(old_dir)
|
|
||||||
|
|
||||||
def run_cmake_build(directory, target, config, args):
|
|
||||||
print('Building', target, config, 'in', directory, 'with', *args or ('default options',))
|
|
||||||
build_args=('--build', directory)
|
|
||||||
if target:
|
|
||||||
build_args += ('--target', target)
|
|
||||||
if config:
|
|
||||||
build_args += ('--config', config)
|
|
||||||
if args:
|
|
||||||
build_args += ('--',)
|
|
||||||
build_args += tuple(args)
|
|
||||||
resultcode, lines = shell('cmake', build_args)
|
|
||||||
|
|
||||||
if resultcode:
|
|
||||||
print('Build FAILED:')
|
|
||||||
if not ARGS.verbose:
|
|
||||||
print(*lines, sep='')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
def run_cmake_tests(directory, target, config):
|
|
||||||
failed = []
|
|
||||||
if IS_WINDOWS:
|
|
||||||
target += '.exe'
|
|
||||||
executable = os.path.join(directory, config if config else 'Debug', target)
|
|
||||||
if(not os.path.exists(executable)):
|
|
||||||
executable = os.path.join(directory, target)
|
|
||||||
print('Unit tests for', executable)
|
|
||||||
testflag = '--unittest'
|
|
||||||
quiet = ''
|
|
||||||
testjobs = ''
|
|
||||||
ipv6 = ''
|
|
||||||
if ARGS.test:
|
|
||||||
testflag += ('=' + ARGS.test)
|
|
||||||
if ARGS.quiet:
|
|
||||||
quiet = '-q'
|
|
||||||
if ARGS.ipv6:
|
|
||||||
ipv6 = '--unittest-ipv6'
|
|
||||||
if ARGS.testjobs:
|
|
||||||
testjobs = ('--unittest-jobs=' + str(ARGS.testjobs))
|
|
||||||
resultcode, lines = shell(executable, (testflag, quiet, testjobs, ipv6))
|
|
||||||
|
|
||||||
if resultcode:
|
|
||||||
if not ARGS.verbose:
|
|
||||||
print('ERROR:', *lines, sep='')
|
|
||||||
failed.append([target, 'unittest'])
|
|
||||||
|
|
||||||
return failed
|
|
||||||
|
|
||||||
def main():
|
|
||||||
all_failed = []
|
|
||||||
if ARGS.all:
|
|
||||||
build_dir_targets = CMAKE_DIR_TARGETS
|
|
||||||
generator_options = CMAKE_ALL_GENERATE_OPTIONS
|
|
||||||
else:
|
|
||||||
build_dir_targets = { tuple(ARGS.dir) : [ARGS.target, ARGS.config] }
|
|
||||||
if ARGS.generator_option:
|
|
||||||
generator_options = [tuple(ARGS.generator_option)]
|
|
||||||
else:
|
|
||||||
generator_options = [tuple()]
|
|
||||||
|
|
||||||
if not build_dir_targets:
|
|
||||||
# Let CMake choose the build tool.
|
|
||||||
build_dir_targets = { () : [] }
|
|
||||||
|
|
||||||
if ARGS.build_option:
|
|
||||||
ARGS.build_option = ARGS.build_option + list(ARGS.extra_args)
|
|
||||||
else:
|
|
||||||
ARGS.build_option = list(ARGS.extra_args)
|
|
||||||
|
|
||||||
for args in generator_options:
|
|
||||||
for build_dirs, (build_targets, build_configs) in build_dir_targets.items():
|
|
||||||
if not build_dirs:
|
|
||||||
build_dirs = ('default',)
|
|
||||||
if not build_targets:
|
|
||||||
build_targets = ('rippled',)
|
|
||||||
if not build_configs:
|
|
||||||
build_configs = ('',)
|
|
||||||
for cmake_dir in build_dirs:
|
|
||||||
cmake_full_dir = get_cmake_dir(cmake_dir)
|
|
||||||
run_cmake(cmake_full_dir, cmake_dir, args)
|
|
||||||
|
|
||||||
for target in build_targets:
|
|
||||||
for config in build_configs:
|
|
||||||
run_cmake_build(cmake_full_dir, target, config, ARGS.build_option)
|
|
||||||
failed = run_cmake_tests(cmake_full_dir, target, config)
|
|
||||||
|
|
||||||
if failed:
|
|
||||||
print('FAILED:', *(':'.join(f) for f in failed))
|
|
||||||
if not ARGS.keep_going:
|
|
||||||
sys.exit(1)
|
|
||||||
else:
|
|
||||||
all_failed.extend([decodeString(cmake_dir +
|
|
||||||
"." + target + "." + config), ':'.join(f)]
|
|
||||||
for f in failed)
|
|
||||||
else:
|
|
||||||
print('Success')
|
|
||||||
if ARGS.clean:
|
|
||||||
shutil.rmtree(cmake_full_dir)
|
|
||||||
|
|
||||||
if all_failed:
|
|
||||||
if len(all_failed) > 1:
|
|
||||||
print()
|
|
||||||
print('FAILED:', *(':'.join(f) for f in all_failed))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
main()
|
|
||||||
sys.exit(0)
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
num_procs=$(lscpu -p | grep -v '^#' | sort -u -t, -k 2,4 | wc -l) # number of physical cores
|
|
||||||
|
|
||||||
path=$(cd $(dirname $0) && pwd)
|
|
||||||
cd $(dirname $path)
|
|
||||||
${path}/Test.py -a -c --testjobs=${num_procs} -- -j${num_procs}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
|
|
||||||
# rippled Packaging and Containers
|
|
||||||
|
|
||||||
This folder contains docker container definitions and configuration
|
|
||||||
files to support building rpm and deb packages of rippled. The container
|
|
||||||
definitions include some additional software/packages that are used
|
|
||||||
for general build/test CI workflows of rippled but are not explicitly
|
|
||||||
needed for the package building workflow.
|
|
||||||
|
|
||||||
## CMake Targets
|
|
||||||
|
|
||||||
If you have docker installed on your local system, then the main
|
|
||||||
CMake file will enable several targets related to building packages:
|
|
||||||
`rpm_container`, `rpm`, `dpkg_container`, and `dpkg`. The package targets
|
|
||||||
depend on the container targets and will trigger a build of those first.
|
|
||||||
The container builds can take several dozen minutes to complete (depending
|
|
||||||
on hardware specs), so quick build cycles are not possible currently. As
|
|
||||||
such, these targets are often best suited to CI/automated build systems.
|
|
||||||
|
|
||||||
The package build can be invoked like any other cmake target from the
|
|
||||||
rippled root folder:
|
|
||||||
```
|
|
||||||
mkdir -p build/pkg && cd build/pkg
|
|
||||||
cmake -Dpackages_only=ON ../..
|
|
||||||
cmake --build . --target rpm
|
|
||||||
```
|
|
||||||
Upon successful completion, the generated package files will be in
|
|
||||||
the `build/pkg/packages` directory. For deb packages, simply replace
|
|
||||||
`rpm` with `dpkg` in the build command above.
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
FROM rippleci/centos:7
|
|
||||||
ARG GIT_COMMIT=unknown
|
|
||||||
ARG CI_USE=false
|
|
||||||
|
|
||||||
LABEL git-commit=$GIT_COMMIT
|
|
||||||
|
|
||||||
COPY centos-builder/centos_setup.sh /tmp/
|
|
||||||
COPY shared/install_cmake.sh /tmp/
|
|
||||||
RUN chmod +x /tmp/centos_setup.sh && \
|
|
||||||
chmod +x /tmp/install_cmake.sh
|
|
||||||
RUN /tmp/centos_setup.sh
|
|
||||||
|
|
||||||
RUN /tmp/install_cmake.sh 3.16.3 /opt/local/cmake-3.16
|
|
||||||
RUN ln -s /opt/local/cmake-3.16 /opt/local/cmake
|
|
||||||
ENV PATH="/opt/local/cmake/bin:$PATH"
|
|
||||||
# TODO: Install latest CMake for testing
|
|
||||||
RUN if [ "${CI_USE}" = true ] ; then /tmp/install_cmake.sh 3.16.3 /opt/local/cmake-3.16; fi
|
|
||||||
|
|
||||||
RUN mkdir -m 777 -p /opt/rippled_bld/pkg
|
|
||||||
|
|
||||||
WORKDIR /opt/rippled_bld/pkg
|
|
||||||
RUN mkdir -m 777 ./rpmbuild
|
|
||||||
RUN mkdir -m 777 ./rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
|
|
||||||
|
|
||||||
COPY packaging/rpm/build_rpm.sh ./
|
|
||||||
CMD ./build_rpm.sh
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
source /etc/os-release
|
|
||||||
|
|
||||||
yum -y upgrade
|
|
||||||
yum -y update
|
|
||||||
yum -y install epel-release centos-release-scl
|
|
||||||
yum -y install \
|
|
||||||
wget curl time gcc-c++ yum-utils autoconf automake pkgconfig libtool \
|
|
||||||
libstdc++-static rpm-build gnupg which make cmake \
|
|
||||||
devtoolset-11 devtoolset-11-gdb devtoolset-11-binutils devtoolset-11-libstdc++-devel \
|
|
||||||
devtoolset-11-libasan-devel devtoolset-11-libtsan-devel devtoolset-11-libubsan-devel devtoolset-11-liblsan-devel \
|
|
||||||
flex flex-devel bison bison-devel parallel \
|
|
||||||
ncurses ncurses-devel ncurses-libs graphviz graphviz-devel \
|
|
||||||
lzip p7zip bzip2 bzip2-devel lzma-sdk lzma-sdk-devel xz-devel \
|
|
||||||
zlib zlib-devel zlib-static texinfo openssl openssl-static \
|
|
||||||
jemalloc jemalloc-devel \
|
|
||||||
libicu-devel htop \
|
|
||||||
rh-python38 \
|
|
||||||
ninja-build git svn \
|
|
||||||
swig perl-Digest-MD5
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
set -ex
|
|
||||||
pkgtype=$1
|
|
||||||
if [ "${pkgtype}" = "rpm" ] ; then
|
|
||||||
container_name="${RPM_CONTAINER_NAME}"
|
|
||||||
elif [ "${pkgtype}" = "dpkg" ] ; then
|
|
||||||
container_name="${DPKG_CONTAINER_NAME}"
|
|
||||||
else
|
|
||||||
echo "invalid package type"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if docker pull "${ARTIFACTORY_HUB}/${container_name}:latest_${CI_COMMIT_REF_SLUG}"; then
|
|
||||||
echo "found container for latest - using as cache."
|
|
||||||
docker tag \
|
|
||||||
"${ARTIFACTORY_HUB}/${container_name}:latest_${CI_COMMIT_REF_SLUG}" \
|
|
||||||
"${container_name}:latest_${CI_COMMIT_REF_SLUG}"
|
|
||||||
CMAKE_EXTRA="-D${pkgtype}_cache_from=${container_name}:latest_${CI_COMMIT_REF_SLUG}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
cmake --version
|
|
||||||
test -d build && rm -rf build
|
|
||||||
mkdir -p build/container && cd build/container
|
|
||||||
eval time \
|
|
||||||
cmake -Dpackages_only=ON -DCMAKE_VERBOSE_MAKEFILE=ON ${CMAKE_EXTRA} \
|
|
||||||
-G Ninja ../..
|
|
||||||
time cmake --build . --target "${pkgtype}_container" -- -v
|
|
||||||
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
set -ex
|
|
||||||
pkgtype=$1
|
|
||||||
if [ "${pkgtype}" = "rpm" ] ; then
|
|
||||||
container_name="${RPM_CONTAINER_FULLNAME}"
|
|
||||||
container_tag="${RPM_CONTAINER_TAG}"
|
|
||||||
elif [ "${pkgtype}" = "dpkg" ] ; then
|
|
||||||
container_name="${DPKG_CONTAINER_FULLNAME}"
|
|
||||||
container_tag="${DPKG_CONTAINER_TAG}"
|
|
||||||
else
|
|
||||||
echo "invalid package type"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
time docker pull "${ARTIFACTORY_HUB}/${container_name}"
|
|
||||||
docker tag \
|
|
||||||
"${ARTIFACTORY_HUB}/${container_name}" \
|
|
||||||
"${container_name}"
|
|
||||||
docker images
|
|
||||||
test -d build && rm -rf build
|
|
||||||
mkdir -p build/${pkgtype} && cd build/${pkgtype}
|
|
||||||
time cmake \
|
|
||||||
-Dpackages_only=ON \
|
|
||||||
-Dcontainer_label="${container_tag}" \
|
|
||||||
-Dhave_package_container=ON \
|
|
||||||
-DCMAKE_VERBOSE_MAKEFILE=ON \
|
|
||||||
-Dunity=OFF \
|
|
||||||
-G Ninja ../..
|
|
||||||
time cmake --build . --target ${pkgtype} -- -v
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
set -e
|
|
||||||
# used as a before/setup script for docker steps in gitlab-ci
|
|
||||||
# expects to be run in standard alpine/dind image
|
|
||||||
echo $(nproc)
|
|
||||||
docker login -u rippled \
|
|
||||||
-p ${ARTIFACTORY_DEPLOY_KEY_RIPPLED} ${ARTIFACTORY_HUB}
|
|
||||||
apk add --update py-pip
|
|
||||||
apk add \
|
|
||||||
bash util-linux coreutils binutils grep \
|
|
||||||
make ninja cmake build-base gcc g++ abuild git \
|
|
||||||
python3 python3-dev
|
|
||||||
pip3 install awscli --break-system-packages
|
|
||||||
# list curdir contents to build log:
|
|
||||||
ls -la
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
case ${CI_COMMIT_REF_NAME} in
|
|
||||||
develop)
|
|
||||||
export COMPONENT="nightly"
|
|
||||||
;;
|
|
||||||
release)
|
|
||||||
export COMPONENT="unstable"
|
|
||||||
;;
|
|
||||||
master)
|
|
||||||
export COMPONENT="stable"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
export COMPONENT="_unknown_"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
@@ -1,771 +0,0 @@
|
|||||||
#########################################################################
|
|
||||||
## ##
|
|
||||||
## gitlab CI defintition for rippled build containers and distro ##
|
|
||||||
## packages (rpm and dpkg). ##
|
|
||||||
## ##
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
# NOTE: these are sensible defaults for Ripple pipelines. These
|
|
||||||
# can be overridden by project or group variables as needed.
|
|
||||||
variables:
|
|
||||||
# these containers are built manually using the rippled
|
|
||||||
# cmake build (container targets) and tagged/pushed so they
|
|
||||||
# can be used here
|
|
||||||
RPM_CONTAINER_TAG: "2023-02-13"
|
|
||||||
RPM_CONTAINER_NAME: "rippled-rpm-builder"
|
|
||||||
RPM_CONTAINER_FULLNAME: "${RPM_CONTAINER_NAME}:${RPM_CONTAINER_TAG}"
|
|
||||||
DPKG_CONTAINER_TAG: "2023-07-31"
|
|
||||||
DPKG_CONTAINER_NAME: "rippled-dpkg-builder"
|
|
||||||
DPKG_CONTAINER_FULLNAME: "${DPKG_CONTAINER_NAME}:${DPKG_CONTAINER_TAG}"
|
|
||||||
ARTIFACTORY_HOST: "artifactory.ops.ripple.com"
|
|
||||||
ARTIFACTORY_HUB: "${ARTIFACTORY_HOST}:6555"
|
|
||||||
GIT_SIGN_PUBKEYS_URL: "https://gitlab.ops.ripple.com/xrpledger/rippled-packages/snippets/49/raw"
|
|
||||||
PUBLIC_REPO_ROOT: "https://repos.ripple.com/repos"
|
|
||||||
# also need to define this variable ONLY for the primary
|
|
||||||
# build/publish pipeline on the mainline repo:
|
|
||||||
# IS_PRIMARY_REPO = "true"
|
|
||||||
|
|
||||||
stages:
|
|
||||||
- build_packages
|
|
||||||
- sign_packages
|
|
||||||
- smoketest
|
|
||||||
- verify_sig
|
|
||||||
- tag_images
|
|
||||||
- push_to_test
|
|
||||||
- verify_from_test
|
|
||||||
- wait_approval_prod
|
|
||||||
- push_to_prod
|
|
||||||
- verify_from_prod
|
|
||||||
- get_final_hashes
|
|
||||||
- build_containers
|
|
||||||
|
|
||||||
.dind_template: &dind_param
|
|
||||||
before_script:
|
|
||||||
- . ./Builds/containers/gitlab-ci/docker_alpine_setup.sh
|
|
||||||
variables:
|
|
||||||
docker_driver: overlay2
|
|
||||||
DOCKER_TLS_CERTDIR: ""
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/docker:latest
|
|
||||||
services:
|
|
||||||
# workaround for TLS issues - consider going back
|
|
||||||
# back to unversioned `dind` when issues are resolved
|
|
||||||
- name: artifactory.ops.ripple.com/docker:stable-dind
|
|
||||||
alias: docker
|
|
||||||
tags:
|
|
||||||
- 4xlarge
|
|
||||||
|
|
||||||
.only_primary_template: &only_primary
|
|
||||||
only:
|
|
||||||
refs:
|
|
||||||
- /^(master|release|develop)$/
|
|
||||||
variables:
|
|
||||||
- $IS_PRIMARY_REPO == "true"
|
|
||||||
|
|
||||||
.smoketest_local_template: &run_local_smoketest
|
|
||||||
tags:
|
|
||||||
- xlarge
|
|
||||||
script:
|
|
||||||
- . ./Builds/containers/gitlab-ci/smoketest.sh local
|
|
||||||
|
|
||||||
.smoketest_repo_template: &run_repo_smoketest
|
|
||||||
tags:
|
|
||||||
- xlarge
|
|
||||||
script:
|
|
||||||
- . ./Builds/containers/gitlab-ci/smoketest.sh repo
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
## ##
|
|
||||||
## stage: build_packages ##
|
|
||||||
## ##
|
|
||||||
## build packages using containers from previous stage. ##
|
|
||||||
## ##
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
rpm_build:
|
|
||||||
timeout: "1h 30m"
|
|
||||||
stage: build_packages
|
|
||||||
<<: *dind_param
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- build/rpm/packages/
|
|
||||||
script:
|
|
||||||
- . ./Builds/containers/gitlab-ci/build_package.sh rpm
|
|
||||||
|
|
||||||
dpkg_build:
|
|
||||||
timeout: "1h 30m"
|
|
||||||
stage: build_packages
|
|
||||||
<<: *dind_param
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- build/dpkg/packages/
|
|
||||||
script:
|
|
||||||
- . ./Builds/containers/gitlab-ci/build_package.sh dpkg
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
## ##
|
|
||||||
## stage: sign_packages ##
|
|
||||||
## ##
|
|
||||||
## build packages using containers from previous stage. ##
|
|
||||||
## ##
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
rpm_sign:
|
|
||||||
stage: sign_packages
|
|
||||||
dependencies:
|
|
||||||
- rpm_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/centos:7
|
|
||||||
<<: *only_primary
|
|
||||||
before_script:
|
|
||||||
- |
|
|
||||||
# Make sure GnuPG is installed
|
|
||||||
yum -y install gnupg rpm-sign
|
|
||||||
# checking GPG signing support
|
|
||||||
if [ -n "$GPG_KEY_B64" ]; then
|
|
||||||
echo "$GPG_KEY_B64"| base64 -d | gpg --batch --no-tty --allow-secret-key-import --import -
|
|
||||||
unset GPG_KEY_B64
|
|
||||||
export GPG_PASSPHRASE=$(echo $GPG_KEY_PASS_B64 | base64 -di)
|
|
||||||
unset GPG_KEY_PASS_B64
|
|
||||||
export GPG_KEYID=$(gpg --with-colon --list-secret-keys | head -n1 | cut -d : -f 5)
|
|
||||||
else
|
|
||||||
echo -e "\033[0;31m****** GPG signing disabled ******\033[0m"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- build/rpm/packages/
|
|
||||||
script:
|
|
||||||
- ls -alh build/rpm/packages
|
|
||||||
- . ./Builds/containers/gitlab-ci/sign_package.sh rpm
|
|
||||||
|
|
||||||
dpkg_sign:
|
|
||||||
stage: sign_packages
|
|
||||||
dependencies:
|
|
||||||
- dpkg_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/ubuntu:18.04
|
|
||||||
<<: *only_primary
|
|
||||||
before_script:
|
|
||||||
- |
|
|
||||||
# make sure we have GnuPG
|
|
||||||
apt update
|
|
||||||
apt install -y gpg dpkg-sig
|
|
||||||
# checking GPG signing support
|
|
||||||
if [ -n "$GPG_KEY_B64" ]; then
|
|
||||||
echo "$GPG_KEY_B64"| base64 -d | gpg --batch --no-tty --allow-secret-key-import --import -
|
|
||||||
unset GPG_KEY_B64
|
|
||||||
export GPG_PASSPHRASE=$(echo $GPG_KEY_PASS_B64 | base64 -di)
|
|
||||||
unset GPG_KEY_PASS_B64
|
|
||||||
export GPG_KEYID=$(gpg --with-colon --list-secret-keys | head -n1 | cut -d : -f 5)
|
|
||||||
else
|
|
||||||
echo -e "\033[0;31m****** GPG signing disabled ******\033[0m"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- build/dpkg/packages/
|
|
||||||
script:
|
|
||||||
- ls -alh build/dpkg/packages
|
|
||||||
- . ./Builds/containers/gitlab-ci/sign_package.sh dpkg
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
## ##
|
|
||||||
## stage: smoketest ##
|
|
||||||
## ##
|
|
||||||
## install unsigned packages from previous step and run unit tests. ##
|
|
||||||
## ##
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
centos_7_smoketest:
|
|
||||||
stage: smoketest
|
|
||||||
dependencies:
|
|
||||||
- rpm_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/centos:7
|
|
||||||
<<: *run_local_smoketest
|
|
||||||
|
|
||||||
rocky_8_smoketest:
|
|
||||||
stage: smoketest
|
|
||||||
dependencies:
|
|
||||||
- rpm_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/rockylinux/rockylinux:8
|
|
||||||
<<: *run_local_smoketest
|
|
||||||
|
|
||||||
rocky_9_smoketest:
|
|
||||||
stage: smoketest
|
|
||||||
dependencies:
|
|
||||||
- rpm_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/rockylinux/rockylinux:9
|
|
||||||
|
|
||||||
<<: *run_local_smoketest
|
|
||||||
|
|
||||||
alma_8_smoketest:
|
|
||||||
stage: smoketest
|
|
||||||
dependencies:
|
|
||||||
- rpm_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/almalinux:8
|
|
||||||
<<: *run_local_smoketest
|
|
||||||
|
|
||||||
alma_9_smoketest:
|
|
||||||
stage: smoketest
|
|
||||||
dependencies:
|
|
||||||
- rpm_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/almalinux:9
|
|
||||||
|
|
||||||
<<: *run_local_smoketest
|
|
||||||
|
|
||||||
fedora_38_smoketest:
|
|
||||||
stage: smoketest
|
|
||||||
dependencies:
|
|
||||||
- rpm_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/fedora:38
|
|
||||||
<<: *run_local_smoketest
|
|
||||||
|
|
||||||
fedora_39_smoketest:
|
|
||||||
stage: smoketest
|
|
||||||
dependencies:
|
|
||||||
- rpm_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/fedora:39
|
|
||||||
<<: *run_local_smoketest
|
|
||||||
|
|
||||||
ubuntu_18_smoketest:
|
|
||||||
stage: smoketest
|
|
||||||
dependencies:
|
|
||||||
- dpkg_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/ubuntu:18.04
|
|
||||||
<<: *run_local_smoketest
|
|
||||||
|
|
||||||
ubuntu_20_smoketest:
|
|
||||||
stage: smoketest
|
|
||||||
dependencies:
|
|
||||||
- dpkg_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/ubuntu:20.04
|
|
||||||
<<: *run_local_smoketest
|
|
||||||
|
|
||||||
ubuntu_22_smoketest:
|
|
||||||
stage: smoketest
|
|
||||||
dependencies:
|
|
||||||
- dpkg_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/ubuntu:22.04
|
|
||||||
<<: *run_local_smoketest
|
|
||||||
|
|
||||||
debian_10_smoketest:
|
|
||||||
stage: smoketest
|
|
||||||
dependencies:
|
|
||||||
- dpkg_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/debian:10
|
|
||||||
<<: *run_local_smoketest
|
|
||||||
|
|
||||||
debian_11_smoketest:
|
|
||||||
stage: smoketest
|
|
||||||
dependencies:
|
|
||||||
- dpkg_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/debian:11
|
|
||||||
<<: *run_local_smoketest
|
|
||||||
|
|
||||||
debian_12_smoketest:
|
|
||||||
stage: smoketest
|
|
||||||
dependencies:
|
|
||||||
- dpkg_build
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/debian:12
|
|
||||||
<<: *run_local_smoketest
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
## ##
|
|
||||||
## stage: verify_sig ##
|
|
||||||
## ##
|
|
||||||
## use git/gpg to verify that HEAD is signed by an approved ##
|
|
||||||
## committer. The whitelist of pubkeys is manually mantained ##
|
|
||||||
## and fetched from GIT_SIGN_PUBKEYS_URL (currently a snippet ##
|
|
||||||
## link). ##
|
|
||||||
## ONLY RUNS FOR PRIMARY BRANCHES/REPO ##
|
|
||||||
## ##
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
verify_head_signed:
|
|
||||||
stage: verify_sig
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/ubuntu:latest
|
|
||||||
<<: *only_primary
|
|
||||||
script:
|
|
||||||
- . ./Builds/containers/gitlab-ci/verify_head_commit.sh
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
## ##
|
|
||||||
## stage: tag_images ##
|
|
||||||
## ##
|
|
||||||
## apply rippled version tag to containers from previous stage. ##
|
|
||||||
## ONLY RUNS FOR PRIMARY BRANCHES/REPO ##
|
|
||||||
## ##
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
tag_bld_images:
|
|
||||||
stage: tag_images
|
|
||||||
variables:
|
|
||||||
docker_driver: overlay2
|
|
||||||
DOCKER_TLS_CERTDIR: ""
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/docker:latest
|
|
||||||
services:
|
|
||||||
# workaround for TLS issues - consider going back
|
|
||||||
# back to unversioned `dind` when issues are resolved
|
|
||||||
- name: artifactory.ops.ripple.com/docker:stable-dind
|
|
||||||
alias: docker
|
|
||||||
tags:
|
|
||||||
- large
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
script:
|
|
||||||
- . ./Builds/containers/gitlab-ci/tag_docker_image.sh
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
## ##
|
|
||||||
## stage: push_to_test ##
|
|
||||||
## ##
|
|
||||||
## push packages to artifactory repositories (test) ##
|
|
||||||
## ONLY RUNS FOR PRIMARY BRANCHES/REPO ##
|
|
||||||
## ##
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
push_test:
|
|
||||||
stage: push_to_test
|
|
||||||
variables:
|
|
||||||
DEB_REPO: "rippled-deb-test-mirror"
|
|
||||||
RPM_REPO: "rippled-rpm-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/alpine:latest
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- files.info
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
script:
|
|
||||||
- . ./Builds/containers/gitlab-ci/push_to_artifactory.sh "PUT" "."
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
## ##
|
|
||||||
## stage: verify_from_test ##
|
|
||||||
## ##
|
|
||||||
## install/test packages from test repos. ##
|
|
||||||
## ONLY RUNS FOR PRIMARY BRANCHES/REPO ##
|
|
||||||
## ##
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
centos_7_verify_repo_test:
|
|
||||||
stage: verify_from_test
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/centos:7
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
rocky_8_verify_repo_test:
|
|
||||||
stage: verify_from_test
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/rockylinux/rockylinux:8
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
rocky_9_verify_repo_test:
|
|
||||||
stage: verify_from_test
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/rockylinux/rockylinux:9
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
almalinux_8_verify_repo_test:
|
|
||||||
stage: verify_from_test
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/almalinux:8
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
almalinux_9_verify_repo_test:
|
|
||||||
stage: verify_from_test
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/almalinux:9
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
fedora_38_verify_repo_test:
|
|
||||||
stage: verify_from_test
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/fedora:38
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
fedora_39_verify_repo_test:
|
|
||||||
stage: verify_from_test
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/fedora:39
|
|
||||||
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
ubuntu_18_verify_repo_test:
|
|
||||||
stage: verify_from_test
|
|
||||||
variables:
|
|
||||||
DISTRO: "bionic"
|
|
||||||
DEB_REPO: "rippled-deb-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/ubuntu:18.04
|
|
||||||
dependencies:
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
ubuntu_20_verify_repo_test:
|
|
||||||
stage: verify_from_test
|
|
||||||
variables:
|
|
||||||
DISTRO: "focal"
|
|
||||||
DEB_REPO: "rippled-deb-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/ubuntu:20.04
|
|
||||||
dependencies:
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
ubuntu_22_verify_repo_test:
|
|
||||||
stage: verify_from_test
|
|
||||||
variables:
|
|
||||||
DISTRO: "jammy"
|
|
||||||
DEB_REPO: "rippled-deb-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/ubuntu:22.04
|
|
||||||
dependencies:
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
debian_10_verify_repo_test:
|
|
||||||
stage: verify_from_test
|
|
||||||
variables:
|
|
||||||
DISTRO: "buster"
|
|
||||||
DEB_REPO: "rippled-deb-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/debian:10
|
|
||||||
dependencies:
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
debian_11_verify_repo_test:
|
|
||||||
stage: verify_from_test
|
|
||||||
variables:
|
|
||||||
DISTRO: "bullseye"
|
|
||||||
DEB_REPO: "rippled-deb-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/debian:11
|
|
||||||
dependencies:
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
debian_12_verify_repo_test:
|
|
||||||
stage: verify_from_test
|
|
||||||
variables:
|
|
||||||
DISTRO: "bookworm"
|
|
||||||
DEB_REPO: "rippled-deb-test-mirror"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/debian:12
|
|
||||||
dependencies:
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
## ##
|
|
||||||
## stage: wait_approval_prod ##
|
|
||||||
## ##
|
|
||||||
## wait for manual approval before proceeding to next stage ##
|
|
||||||
## which pushes to prod repo. ##
|
|
||||||
## ONLY RUNS FOR PRIMARY BRANCHES/REPO ##
|
|
||||||
## ##
|
|
||||||
#########################################################################
|
|
||||||
wait_before_push_prod:
|
|
||||||
stage: wait_approval_prod
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/alpine:latest
|
|
||||||
<<: *only_primary
|
|
||||||
script:
|
|
||||||
- echo "proceeding to next stage"
|
|
||||||
when: manual
|
|
||||||
allow_failure: false
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
## ##
|
|
||||||
## stage: push_to_prod ##
|
|
||||||
## ##
|
|
||||||
## push packages to artifactory repositories (prod) ##
|
|
||||||
## ONLY RUNS FOR PRIMARY BRANCHES/REPO ##
|
|
||||||
## ##
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
push_prod:
|
|
||||||
variables:
|
|
||||||
DEB_REPO: "rippled-deb"
|
|
||||||
RPM_REPO: "rippled-rpm"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/alpine:latest
|
|
||||||
stage: push_to_prod
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- files.info
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
script:
|
|
||||||
- . ./Builds/containers/gitlab-ci/push_to_artifactory.sh "PUT" "."
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
## ##
|
|
||||||
## stage: verify_from_prod ##
|
|
||||||
## ##
|
|
||||||
## install/test packages from prod repos. ##
|
|
||||||
## ONLY RUNS FOR PRIMARY BRANCHES/REPO ##
|
|
||||||
## ##
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
centos_7_verify_repo_prod:
|
|
||||||
stage: verify_from_prod
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/centos:7
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
rocky_8_verify_repo_prod:
|
|
||||||
stage: verify_from_prod
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/rockylinux/rockylinux:8
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
rocky_9_verify_repo_prod:
|
|
||||||
stage: verify_from_prod
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/rockylinux/rockylinux:9
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
alma_8_verify_repo_prod:
|
|
||||||
stage: verify_from_prod
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/almalinux:8
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
alma_9_verify_repo_prod:
|
|
||||||
stage: verify_from_prod
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/almalinux:9
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
fedora_37_verify_repo_prod:
|
|
||||||
stage: verify_from_prod
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/fedora:37
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
fedora_38_verify_repo_prod:
|
|
||||||
stage: verify_from_prod
|
|
||||||
variables:
|
|
||||||
RPM_REPO: "rippled-rpm"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/fedora:38
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
ubuntu_18_verify_repo_prod:
|
|
||||||
stage: verify_from_prod
|
|
||||||
variables:
|
|
||||||
DISTRO: "bionic"
|
|
||||||
DEB_REPO: "rippled-deb"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/ubuntu:18.04
|
|
||||||
dependencies:
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
ubuntu_20_verify_repo_prod:
|
|
||||||
stage: verify_from_prod
|
|
||||||
variables:
|
|
||||||
DISTRO: "focal"
|
|
||||||
DEB_REPO: "rippled-deb"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/ubuntu:20.04
|
|
||||||
dependencies:
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
ubuntu_22_verify_repo_prod:
|
|
||||||
stage: verify_from_prod
|
|
||||||
variables:
|
|
||||||
DISTRO: "jammy"
|
|
||||||
DEB_REPO: "rippled-deb"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/ubuntu:22.04
|
|
||||||
dependencies:
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
debian_10_verify_repo_prod:
|
|
||||||
stage: verify_from_prod
|
|
||||||
variables:
|
|
||||||
DISTRO: "buster"
|
|
||||||
DEB_REPO: "rippled-deb"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/debian:10
|
|
||||||
dependencies:
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
debian_11_verify_repo_prod:
|
|
||||||
stage: verify_from_prod
|
|
||||||
variables:
|
|
||||||
DISTRO: "bullseye"
|
|
||||||
DEB_REPO: "rippled-deb"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/debian:11
|
|
||||||
dependencies:
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
debian_12_verify_repo_prod:
|
|
||||||
stage: verify_from_prod
|
|
||||||
variables:
|
|
||||||
DISTRO: "bookworm"
|
|
||||||
DEB_REPO: "rippled-deb"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/debian:12
|
|
||||||
dependencies:
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
<<: *run_repo_smoketest
|
|
||||||
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
## ##
|
|
||||||
## stage: get_final_hashes ##
|
|
||||||
## ##
|
|
||||||
## fetch final hashes from artifactory. ##
|
|
||||||
## ONLY RUNS FOR PRIMARY BRANCHES/REPO ##
|
|
||||||
## ##
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
get_prod_hashes:
|
|
||||||
variables:
|
|
||||||
DEB_REPO: "rippled-deb"
|
|
||||||
RPM_REPO: "rippled-rpm"
|
|
||||||
image:
|
|
||||||
name: artifactory.ops.ripple.com/alpine:latest
|
|
||||||
stage: get_final_hashes
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- files.info
|
|
||||||
dependencies:
|
|
||||||
- rpm_sign
|
|
||||||
- dpkg_sign
|
|
||||||
<<: *only_primary
|
|
||||||
script:
|
|
||||||
- . ./Builds/containers/gitlab-ci/push_to_artifactory.sh "GET" ".checksums"
|
|
||||||
|
|
||||||
#########################################################################
|
|
||||||
## ##
|
|
||||||
## stage: build_containers ##
|
|
||||||
## ##
|
|
||||||
## build containers from docker definitions. These containers are NOT ##
|
|
||||||
## used for the package build. This step is only used to ensure that ##
|
|
||||||
## the package build targets and files are still working properly. ##
|
|
||||||
## ##
|
|
||||||
#########################################################################
|
|
||||||
|
|
||||||
build_centos_container:
|
|
||||||
stage: build_containers
|
|
||||||
<<: *dind_param
|
|
||||||
script:
|
|
||||||
- . ./Builds/containers/gitlab-ci/build_container.sh rpm
|
|
||||||
|
|
||||||
build_ubuntu_container:
|
|
||||||
stage: build_containers
|
|
||||||
<<: *dind_param
|
|
||||||
script:
|
|
||||||
- . ./Builds/containers/gitlab-ci/build_container.sh dpkg
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
set -e
|
|
||||||
action=$1
|
|
||||||
filter=$2
|
|
||||||
|
|
||||||
. ./Builds/containers/gitlab-ci/get_component.sh
|
|
||||||
|
|
||||||
apk add curl jq coreutils util-linux
|
|
||||||
TOPDIR=$(pwd)
|
|
||||||
|
|
||||||
# DPKG
|
|
||||||
|
|
||||||
cd $TOPDIR
|
|
||||||
cd build/dpkg/packages
|
|
||||||
CURLARGS="-sk -X${action} -urippled:${ARTIFACTORY_DEPLOY_KEY_RIPPLED}"
|
|
||||||
RIPPLED_PKG=$(ls rippled_*.deb)
|
|
||||||
RIPPLED_REPORTING_PKG=$(ls rippled-reporting_*.deb)
|
|
||||||
RIPPLED_DBG_PKG=$(ls rippled-dbgsym_*.*deb)
|
|
||||||
RIPPLED_REPORTING_DBG_PKG=$(ls rippled-reporting-dbgsym_*.*deb)
|
|
||||||
# TODO - where to upload src tgz?
|
|
||||||
RIPPLED_SRC=$(ls rippled_*.orig.tar.gz)
|
|
||||||
DEB_MATRIX=";deb.component=${COMPONENT};deb.architecture=amd64"
|
|
||||||
for dist in bookworm buster bullseye bionic focal jammy; do
|
|
||||||
DEB_MATRIX="${DEB_MATRIX};deb.distribution=${dist}"
|
|
||||||
done
|
|
||||||
echo "{ \"debs\": {" > "${TOPDIR}/files.info"
|
|
||||||
for deb in ${RIPPLED_PKG} ${RIPPLED_DBG_PKG} ${RIPPLED_REPORTING_PKG} ${RIPPLED_REPORTING_DBG_PKG}; do
|
|
||||||
# first item doesn't get a comma separator
|
|
||||||
if [ $deb != $RIPPLED_PKG ] ; then
|
|
||||||
echo "," >> "${TOPDIR}/files.info"
|
|
||||||
fi
|
|
||||||
echo "\"${deb}\"": | tee -a "${TOPDIR}/files.info"
|
|
||||||
ca="${CURLARGS}"
|
|
||||||
if [ "${action}" = "PUT" ] ; then
|
|
||||||
url="https://${ARTIFACTORY_HOST}/artifactory/${DEB_REPO}/pool/${COMPONENT}/${deb}${DEB_MATRIX}"
|
|
||||||
ca="${ca} -T${deb}"
|
|
||||||
elif [ "${action}" = "GET" ] ; then
|
|
||||||
url="https://${ARTIFACTORY_HOST}/artifactory/api/storage/${DEB_REPO}/pool/${COMPONENT}/${deb}"
|
|
||||||
fi
|
|
||||||
echo "file info request url --> ${url}"
|
|
||||||
eval "curl ${ca} \"${url}\"" | jq -M "${filter}" | tee -a "${TOPDIR}/files.info"
|
|
||||||
done
|
|
||||||
echo "}," >> "${TOPDIR}/files.info"
|
|
||||||
|
|
||||||
# RPM
|
|
||||||
|
|
||||||
cd $TOPDIR
|
|
||||||
cd build/rpm/packages
|
|
||||||
RIPPLED_PKG=$(ls rippled-[0-9]*.x86_64.rpm)
|
|
||||||
RIPPLED_DEV_PKG=$(ls rippled-devel*.rpm)
|
|
||||||
RIPPLED_DBG_PKG=$(ls rippled-debuginfo*.rpm)
|
|
||||||
RIPPLED_REPORTING_PKG=$(ls rippled-reporting*.rpm)
|
|
||||||
# TODO - where to upload src rpm ?
|
|
||||||
RIPPLED_SRC=$(ls rippled-[0-9]*.src.rpm)
|
|
||||||
echo "\"rpms\": {" >> "${TOPDIR}/files.info"
|
|
||||||
for rpm in ${RIPPLED_PKG} ${RIPPLED_DEV_PKG} ${RIPPLED_DBG_PKG} ${RIPPLED_REPORTING_PKG}; do
|
|
||||||
# first item doesn't get a comma separator
|
|
||||||
if [ $rpm != $RIPPLED_PKG ] ; then
|
|
||||||
echo "," >> "${TOPDIR}/files.info"
|
|
||||||
fi
|
|
||||||
echo "\"${rpm}\"": | tee -a "${TOPDIR}/files.info"
|
|
||||||
ca="${CURLARGS}"
|
|
||||||
if [ "${action}" = "PUT" ] ; then
|
|
||||||
url="https://${ARTIFACTORY_HOST}/artifactory/${RPM_REPO}/${COMPONENT}/"
|
|
||||||
ca="${ca} -T${rpm}"
|
|
||||||
elif [ "${action}" = "GET" ] ; then
|
|
||||||
url="https://${ARTIFACTORY_HOST}/artifactory/api/storage/${RPM_REPO}/${COMPONENT}/${rpm}"
|
|
||||||
fi
|
|
||||||
echo "file info request url --> ${url}"
|
|
||||||
eval "curl ${ca} \"${url}\"" | jq -M "${filter}" | tee -a "${TOPDIR}/files.info"
|
|
||||||
done
|
|
||||||
echo "}}" >> "${TOPDIR}/files.info"
|
|
||||||
jq '.' "${TOPDIR}/files.info" > "${TOPDIR}/files.info.tmp"
|
|
||||||
mv "${TOPDIR}/files.info.tmp" "${TOPDIR}/files.info"
|
|
||||||
|
|
||||||
if [ ! -z "${SLACK_NOTIFY_URL}" ] && [ "${action}" = "GET" ] ; then
|
|
||||||
# extract files.info content to variable and sanitize so it can
|
|
||||||
# be interpolated into a slack text field below
|
|
||||||
finfo=$(cat ${TOPDIR}/files.info | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/\\n/g' | sed -E 's/"/\\"/g')
|
|
||||||
# try posting file info to slack.
|
|
||||||
# can add channel field to payload if the
|
|
||||||
# default channel is incorrect. Get rid of
|
|
||||||
# newlines in payload json since slack doesn't accept them
|
|
||||||
CONTENT=$(tr -d '[\n]' <<JSON
|
|
||||||
payload={
|
|
||||||
"username": "GitlabCI",
|
|
||||||
"text": "The package build for branch \`${CI_COMMIT_REF_NAME}\` is complete. File hashes are: \`\`\`${finfo}\`\`\`",
|
|
||||||
"icon_emoji": ":package:"}
|
|
||||||
JSON
|
|
||||||
)
|
|
||||||
curl ${SLACK_NOTIFY_URL} --data-urlencode "${CONTENT}"
|
|
||||||
fi
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -eo pipefail
|
|
||||||
|
|
||||||
sign_dpkg() {
|
|
||||||
if [ -n "${GPG_KEYID}" ]; then
|
|
||||||
dpkg-sig \
|
|
||||||
-g "--no-tty --digest-algo 'sha512' --passphrase '${GPG_PASSPHRASE}' --pinentry-mode=loopback" \
|
|
||||||
-k "${GPG_KEYID}" \
|
|
||||||
--sign builder \
|
|
||||||
"build/dpkg/packages/*.deb"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
sign_rpm() {
|
|
||||||
if [ -n "${GPG_KEYID}" ] ; then
|
|
||||||
find build/rpm/packages -name "*.rpm" -exec bash -c '
|
|
||||||
echo "yes" | setsid rpm \
|
|
||||||
--define "_gpg_name ${GPG_KEYID}" \
|
|
||||||
--define "_signature gpg" \
|
|
||||||
--define "__gpg_check_password_cmd /bin/true" \
|
|
||||||
--define "__gpg_sign_cmd %{__gpg} gpg --batch --no-armor --digest-algo 'sha512' --passphrase '${GPG_PASSPHRASE}' --no-secmem-warning -u '%{_gpg_name}' --sign --detach-sign --output %{__signature_filename} %{__plaintext_filename}" \
|
|
||||||
--addsign '{} \;
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
case "${1}" in
|
|
||||||
dpkg)
|
|
||||||
sign_dpkg
|
|
||||||
;;
|
|
||||||
rpm)
|
|
||||||
sign_rpm
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Usage: ${0} (dpkg|rpm)"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
set -e
|
|
||||||
install_from=$1
|
|
||||||
use_private=${2:-0} # this option not currently needed by any CI scripts,
|
|
||||||
# reserved for possible future use
|
|
||||||
if [ "$use_private" -gt 0 ] ; then
|
|
||||||
REPO_ROOT="https://rippled:${ARTIFACTORY_DEPLOY_KEY_RIPPLED}@${ARTIFACTORY_HOST}/artifactory"
|
|
||||||
else
|
|
||||||
REPO_ROOT="${PUBLIC_REPO_ROOT}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
. ./Builds/containers/gitlab-ci/get_component.sh
|
|
||||||
|
|
||||||
. /etc/os-release
|
|
||||||
case ${ID} in
|
|
||||||
ubuntu|debian)
|
|
||||||
pkgtype="dpkg"
|
|
||||||
;;
|
|
||||||
fedora|centos|rhel|scientific|rocky|almalinux)
|
|
||||||
pkgtype="rpm"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "unrecognized distro!"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# this script provides info variables about pkg version
|
|
||||||
. build/${pkgtype}/packages/build_vars
|
|
||||||
|
|
||||||
if [ "${pkgtype}" = "dpkg" ] ; then
|
|
||||||
# sometimes update fails and requires a cleanup
|
|
||||||
updateWithRetry()
|
|
||||||
{
|
|
||||||
if ! apt-get -y update ; then
|
|
||||||
rm -rvf /var/lib/apt/lists/*
|
|
||||||
apt-get -y clean
|
|
||||||
apt-get -y update
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
if [ "${install_from}" = "repo" ] ; then
|
|
||||||
apt-get -y upgrade
|
|
||||||
updateWithRetry
|
|
||||||
apt-get -y install apt apt-transport-https ca-certificates coreutils util-linux wget gnupg
|
|
||||||
wget -q -O - "${REPO_ROOT}/api/gpg/key/public" | apt-key add -
|
|
||||||
echo "deb ${REPO_ROOT}/${DEB_REPO} ${DISTRO} ${COMPONENT}" >> /etc/apt/sources.list
|
|
||||||
updateWithRetry
|
|
||||||
# uncomment this next line if you want to see the available package versions
|
|
||||||
# apt-cache policy rippled
|
|
||||||
apt-get -y install rippled=${dpkg_full_version}
|
|
||||||
elif [ "${install_from}" = "local" ] ; then
|
|
||||||
# cached pkg install
|
|
||||||
updateWithRetry
|
|
||||||
apt-get -y install libprotobuf-dev libprotoc-dev protobuf-compiler libssl-dev
|
|
||||||
rm -f build/dpkg/packages/rippled-dbgsym*.*
|
|
||||||
dpkg --no-debsig -i build/dpkg/packages/*.deb
|
|
||||||
else
|
|
||||||
echo "unrecognized pkg source!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
yum -y update
|
|
||||||
if [ "${install_from}" = "repo" ] ; then
|
|
||||||
pkgs=("yum-utils coreutils util-linux")
|
|
||||||
case "$ID" in
|
|
||||||
rocky|almalinux)
|
|
||||||
pkgs="${pkgs[@]/coreutils}"
|
|
||||||
esac
|
|
||||||
yum install -y $pkgs
|
|
||||||
REPOFILE="/etc/yum.repos.d/artifactory.repo"
|
|
||||||
echo "[Artifactory]" > ${REPOFILE}
|
|
||||||
echo "name=Artifactory" >> ${REPOFILE}
|
|
||||||
echo "baseurl=${REPO_ROOT}/${RPM_REPO}/${COMPONENT}/" >> ${REPOFILE}
|
|
||||||
echo "enabled=1" >> ${REPOFILE}
|
|
||||||
echo "gpgcheck=0" >> ${REPOFILE}
|
|
||||||
echo "gpgkey=${REPO_ROOT}/${RPM_REPO}/${COMPONENT}/repodata/repomd.xml.key" >> ${REPOFILE}
|
|
||||||
echo "repo_gpgcheck=1" >> ${REPOFILE}
|
|
||||||
yum -y update
|
|
||||||
# uncomment this next line if you want to see the available package versions
|
|
||||||
# yum --showduplicates list rippled
|
|
||||||
yum -y install ${rpm_version_release}
|
|
||||||
elif [ "${install_from}" = "local" ] ; then
|
|
||||||
rm -f build/rpm/packages/rippled-debug*.rpm
|
|
||||||
rm -f build/rpm/packages/rippled-devel*.rpm
|
|
||||||
rm -f build/rpm/packages/*.src.rpm
|
|
||||||
rpm -i build/rpm/packages/*.rpm
|
|
||||||
else
|
|
||||||
echo "unrecognized pkg source!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# verify installed version
|
|
||||||
INSTALLED=$(/opt/ripple/bin/rippled --version | awk '{print $NF}')
|
|
||||||
if [ "${rippled_version}" != "${INSTALLED}" ] ; then
|
|
||||||
echo "INSTALLED version ${INSTALLED} does not match ${rippled_version}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# run unit tests
|
|
||||||
/opt/ripple/bin/rippled --unittest --unittest-jobs $(nproc)
|
|
||||||
/opt/ripple/bin/validator-keys --unittest
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
set -e
|
|
||||||
docker login -u rippled \
|
|
||||||
-p ${ARTIFACTORY_DEPLOY_KEY_RIPPLED} "${ARTIFACTORY_HUB}"
|
|
||||||
# this gives us rippled_version :
|
|
||||||
source build/rpm/packages/build_vars
|
|
||||||
docker pull "${ARTIFACTORY_HUB}/${RPM_CONTAINER_FULLNAME}"
|
|
||||||
docker pull "${ARTIFACTORY_HUB}/${DPKG_CONTAINER_FULLNAME}"
|
|
||||||
# tag/push two labels...one using the current rippled version and one just using "latest"
|
|
||||||
for label in ${rippled_version} latest ; do
|
|
||||||
docker tag \
|
|
||||||
"${ARTIFACTORY_HUB}/${RPM_CONTAINER_FULLNAME}" \
|
|
||||||
"${ARTIFACTORY_HUB}/${RPM_CONTAINER_NAME}:${label}_${CI_COMMIT_REF_SLUG}"
|
|
||||||
docker push \
|
|
||||||
"${ARTIFACTORY_HUB}/${RPM_CONTAINER_NAME}:${label}_${CI_COMMIT_REF_SLUG}"
|
|
||||||
docker tag \
|
|
||||||
"${ARTIFACTORY_HUB}/${DPKG_CONTAINER_FULLNAME}" \
|
|
||||||
"${ARTIFACTORY_HUB}/${DPKG_CONTAINER_NAME}:${label}_${CI_COMMIT_REF_SLUG}"
|
|
||||||
docker push \
|
|
||||||
"${ARTIFACTORY_HUB}/${DPKG_CONTAINER_NAME}:${label}_${CI_COMMIT_REF_SLUG}"
|
|
||||||
done
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/usr/bin/env sh
|
|
||||||
set -ex
|
|
||||||
apt -y update
|
|
||||||
DEBIAN_FRONTEND="noninteractive" apt-get -y install tzdata
|
|
||||||
apt -y install software-properties-common curl git gnupg
|
|
||||||
curl -sk -o rippled-pubkeys.txt "${GIT_SIGN_PUBKEYS_URL}"
|
|
||||||
gpg --import rippled-pubkeys.txt
|
|
||||||
if git verify-commit HEAD; then
|
|
||||||
echo "git commit signature check passed"
|
|
||||||
else
|
|
||||||
echo "git commit signature check failed"
|
|
||||||
git log -n 5 --color \
|
|
||||||
--pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an> [%G?]%Creset' \
|
|
||||||
--abbrev-commit
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
# make sure pkg source files are up to date with repo
|
|
||||||
cd /opt/rippled_bld/pkg
|
|
||||||
cp -fpru rippled/Builds/containers/packaging/dpkg/debian/. debian/
|
|
||||||
cp -fpu rippled/Builds/containers/shared/rippled*.service debian/
|
|
||||||
cp -fpu rippled/Builds/containers/shared/update_sources.sh .
|
|
||||||
source update_sources.sh
|
|
||||||
|
|
||||||
# Build the dpkg
|
|
||||||
|
|
||||||
#dpkg uses - as separator, so we need to change our -bN versions to tilde
|
|
||||||
RIPPLED_DPKG_VERSION=$(echo "${RIPPLED_VERSION}" | sed 's!-!~!g')
|
|
||||||
# TODO - decide how to handle the trailing/release
|
|
||||||
# version here (hardcoded to 1). Does it ever need to change?
|
|
||||||
RIPPLED_DPKG_FULL_VERSION="${RIPPLED_DPKG_VERSION}-1"
|
|
||||||
git config --global --add safe.directory /opt/rippled_bld/pkg/rippled
|
|
||||||
cd /opt/rippled_bld/pkg/rippled
|
|
||||||
if [[ -n $(git status --porcelain) ]]; then
|
|
||||||
git status
|
|
||||||
error "Unstaged changes in this repo - please commit first"
|
|
||||||
fi
|
|
||||||
git archive --format tar.gz --prefix rippled-${RIPPLED_DPKG_VERSION}/ -o ../rippled-${RIPPLED_DPKG_VERSION}.tar.gz HEAD
|
|
||||||
cd ..
|
|
||||||
# dpkg debmake would normally create this link, but we do it manually
|
|
||||||
ln -s ./rippled-${RIPPLED_DPKG_VERSION}.tar.gz rippled_${RIPPLED_DPKG_VERSION}.orig.tar.gz
|
|
||||||
tar xvf rippled-${RIPPLED_DPKG_VERSION}.tar.gz
|
|
||||||
cd rippled-${RIPPLED_DPKG_VERSION}
|
|
||||||
cp -pr ../debian .
|
|
||||||
|
|
||||||
# dpkg requires a changelog. We don't currently maintain
|
|
||||||
# a useable one, so let's just fake it with our current version
|
|
||||||
# TODO : not sure if the "unstable" will need to change for
|
|
||||||
# release packages (?)
|
|
||||||
NOWSTR=$(TZ=UTC date -R)
|
|
||||||
cat << CHANGELOG > ./debian/changelog
|
|
||||||
rippled (${RIPPLED_DPKG_FULL_VERSION}) unstable; urgency=low
|
|
||||||
|
|
||||||
* see RELEASENOTES
|
|
||||||
|
|
||||||
-- Ripple Labs Inc. <support@ripple.com> ${NOWSTR}
|
|
||||||
CHANGELOG
|
|
||||||
|
|
||||||
# PATH must be preserved for our more modern cmake in /opt/local
|
|
||||||
# TODO : consider allowing lintian to run in future ?
|
|
||||||
export DH_BUILD_DDEBS=1
|
|
||||||
debuild --no-lintian --preserve-envvar PATH --preserve-env -us -uc
|
|
||||||
rc=$?; if [[ $rc != 0 ]]; then
|
|
||||||
error "error building dpkg"
|
|
||||||
fi
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
# copy artifacts
|
|
||||||
cp rippled-reporting_${RIPPLED_DPKG_FULL_VERSION}_amd64.deb ${PKG_OUTDIR}
|
|
||||||
cp rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.deb ${PKG_OUTDIR}
|
|
||||||
cp rippled_${RIPPLED_DPKG_FULL_VERSION}.dsc ${PKG_OUTDIR}
|
|
||||||
# dbgsym suffix is ddeb under newer debuild, but just deb under earlier
|
|
||||||
cp rippled-dbgsym_${RIPPLED_DPKG_FULL_VERSION}_amd64.* ${PKG_OUTDIR}
|
|
||||||
cp rippled-reporting-dbgsym_${RIPPLED_DPKG_FULL_VERSION}_amd64.* ${PKG_OUTDIR}
|
|
||||||
cp rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.changes ${PKG_OUTDIR}
|
|
||||||
cp rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.build ${PKG_OUTDIR}
|
|
||||||
cp rippled_${RIPPLED_DPKG_VERSION}.orig.tar.gz ${PKG_OUTDIR}
|
|
||||||
cp rippled_${RIPPLED_DPKG_FULL_VERSION}.debian.tar.xz ${PKG_OUTDIR}
|
|
||||||
# buildinfo is only generated by later version of debuild
|
|
||||||
if [ -e rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.buildinfo ] ; then
|
|
||||||
cp rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.buildinfo ${PKG_OUTDIR}
|
|
||||||
fi
|
|
||||||
|
|
||||||
pushd ${PKG_OUTDIR}
|
|
||||||
for f in *.ddeb; do mv -- "$f" "${f%.ddeb}.deb"; done
|
|
||||||
popd
|
|
||||||
|
|
||||||
cat rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.changes
|
|
||||||
# extract the text in the .changes file that appears between
|
|
||||||
# Checksums-Sha256: ...
|
|
||||||
# and
|
|
||||||
# Files: ...
|
|
||||||
awk '/Checksums-Sha256:/{hit=1;next}/Files:/{hit=0}hit' \
|
|
||||||
rippled_${RIPPLED_DPKG_VERSION}-1_amd64.changes | \
|
|
||||||
sed -E 's!^[[:space:]]+!!' > shasums
|
|
||||||
DEB_SHA256=$(cat shasums | \
|
|
||||||
grep "rippled_${RIPPLED_DPKG_VERSION}-1_amd64.deb" | cut -d " " -f 1)
|
|
||||||
DBG_SHA256=$(cat shasums | \
|
|
||||||
grep "rippled-dbgsym_${RIPPLED_DPKG_VERSION}-1_amd64.*" | cut -d " " -f 1)
|
|
||||||
REPORTING_DBG_SHA256=$(cat shasums | \
|
|
||||||
grep "rippled-reporting-dbgsym_${RIPPLED_DPKG_VERSION}-1_amd64.*" | cut -d " " -f 1)
|
|
||||||
REPORTING_SHA256=$(cat shasums | \
|
|
||||||
grep "rippled-reporting_${RIPPLED_DPKG_VERSION}-1_amd64.deb" | cut -d " " -f 1)
|
|
||||||
SRC_SHA256=$(cat shasums | \
|
|
||||||
grep "rippled_${RIPPLED_DPKG_VERSION}.orig.tar.gz" | cut -d " " -f 1)
|
|
||||||
echo "deb_sha256=${DEB_SHA256}" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "dbg_sha256=${DBG_SHA256}" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "reporting_sha256=${REPORTING_SHA256}" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "reporting_dbg_sha256=${REPORTING_DBG_SHA256}" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "src_sha256=${SRC_SHA256}" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "rippled_version=${RIPPLED_VERSION}" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "dpkg_version=${RIPPLED_DPKG_VERSION}" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "dpkg_full_version=${RIPPLED_DPKG_FULL_VERSION}" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
rippled daemon
|
|
||||||
|
|
||||||
-- Mike Ellery <mellery451@gmail.com> Tue, 04 Dec 2018 18:19:03 +0000
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
10
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
Source: rippled
|
|
||||||
Section: misc
|
|
||||||
Priority: extra
|
|
||||||
Maintainer: Ripple Labs Inc. <support@ripple.com>
|
|
||||||
Build-Depends: cmake, debhelper (>=9), zlib1g-dev, dh-systemd, ninja-build
|
|
||||||
Standards-Version: 3.9.7
|
|
||||||
Homepage: http://ripple.com/
|
|
||||||
|
|
||||||
Package: rippled
|
|
||||||
Architecture: any
|
|
||||||
Multi-Arch: foreign
|
|
||||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
|
||||||
Description: rippled daemon
|
|
||||||
|
|
||||||
Package: rippled-reporting
|
|
||||||
Architecture: any
|
|
||||||
Multi-Arch: foreign
|
|
||||||
Depends: ${misc:Depends}, ${shlibs:Depends}
|
|
||||||
Description: rippled reporting daemon
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
|
||||||
Upstream-Name: rippled
|
|
||||||
Source: https://github.com/ripple/rippled
|
|
||||||
|
|
||||||
Files: *
|
|
||||||
Copyright: 2012-2019 Ripple Labs Inc.
|
|
||||||
|
|
||||||
License: __UNKNOWN__
|
|
||||||
|
|
||||||
The accompanying files under various copyrights.
|
|
||||||
|
|
||||||
Copyright (c) 2012, 2013, 2014 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
|
|
||||||
The accompanying files incorporate work covered by the following copyright
|
|
||||||
and previous license notice:
|
|
||||||
|
|
||||||
Copyright (c) 2011 Arthur Britto, David Schwartz, Jed McCaleb,
|
|
||||||
Vinnie Falco, Bob Way, Eric Lombrozo, Nikolaos D. Bougalis, Howard Hinnant
|
|
||||||
|
|
||||||
Some code from Raw Material Software, Ltd., provided under the terms of the
|
|
||||||
ISC License. See the corresponding source files for more details.
|
|
||||||
Copyright (c) 2013 - Raw Material Software Ltd.
|
|
||||||
Please visit http://www.juce.com
|
|
||||||
|
|
||||||
Some code from ASIO examples:
|
|
||||||
// Copyright (c) 2003-2011 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
||||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
|
|
||||||
Some code from Bitcoin:
|
|
||||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
||||||
// Copyright (c) 2011 The Bitcoin developers
|
|
||||||
// Distributed under the MIT/X11 software license, see the accompanying
|
|
||||||
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
|
||||||
|
|
||||||
Some code from Tom Wu:
|
|
||||||
This software is covered under the following copyright:
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (c) 2003-2005 Tom Wu
|
|
||||||
* All Rights Reserved.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
* a copy of this software and associated documentation files (the
|
|
||||||
* "Software"), to deal in the Software without restriction, including
|
|
||||||
* without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
* permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
* the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be
|
|
||||||
* included in all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
|
|
||||||
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
|
|
||||||
* INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
|
|
||||||
* RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
|
|
||||||
* THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
|
|
||||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*
|
|
||||||
* In addition, the following condition applies:
|
|
||||||
*
|
|
||||||
* All redistributions must retain an intact copy of this copyright notice
|
|
||||||
* and disclaimer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
Address all questions regarding this license to:
|
|
||||||
|
|
||||||
Tom Wu
|
|
||||||
tjw@cs.Stanford.EDU
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
/var/log/rippled/
|
|
||||||
/var/lib/rippled/
|
|
||||||
/etc/systemd/system/rippled.service.d/
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
README.md
|
|
||||||
LICENSE.md
|
|
||||||
RELEASENOTES.md
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
opt/ripple/include
|
|
||||||
opt/ripple/lib/*.a
|
|
||||||
opt/ripple/lib/cmake/ripple
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
/var/log/rippled-reporting/
|
|
||||||
/var/lib/rippled-reporting/
|
|
||||||
/etc/systemd/system/rippled-reporting.service.d/
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
build.rippled-reporting/rippled-reporting opt/rippled-reporting/bin
|
|
||||||
cfg/rippled-reporting.cfg opt/rippled-reporting/etc
|
|
||||||
debian/tmp/opt/rippled-reporting/etc/validators.txt opt/rippled-reporting/etc
|
|
||||||
|
|
||||||
opt/rippled-reporting/bin/update-rippled-reporting.sh
|
|
||||||
opt/rippled-reporting/bin/getRippledReportingInfo
|
|
||||||
opt/rippled-reporting/etc/update-rippled-reporting-cron
|
|
||||||
etc/logrotate.d/rippled-reporting
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
opt/rippled-reporting/etc/rippled-reporting.cfg etc/opt/rippled-reporting/rippled-reporting.cfg
|
|
||||||
opt/rippled-reporting/etc/validators.txt etc/opt/rippled-reporting/validators.txt
|
|
||||||
opt/rippled-reporting/bin/rippled-reporting usr/local/bin/rippled-reporting
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
USER_NAME=rippled-reporting
|
|
||||||
GROUP_NAME=rippled-reporting
|
|
||||||
case "$1" in
|
|
||||||
configure)
|
|
||||||
id -u $USER_NAME >/dev/null 2>&1 || \
|
|
||||||
adduser --system --quiet \
|
|
||||||
--home /nonexistent --no-create-home \
|
|
||||||
--disabled-password \
|
|
||||||
--group "$GROUP_NAME"
|
|
||||||
chown -R $USER_NAME:$GROUP_NAME /var/log/rippled-reporting/
|
|
||||||
chown -R $USER_NAME:$GROUP_NAME /var/lib/rippled-reporting/
|
|
||||||
chmod 755 /var/log/rippled-reporting/
|
|
||||||
chmod 755 /var/lib/rippled-reporting/
|
|
||||||
chown -R $USER_NAME:$GROUP_NAME /opt/rippled-reporting
|
|
||||||
|
|
||||||
;;
|
|
||||||
|
|
||||||
abort-upgrade|abort-remove|abort-deconfigure)
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "postinst called with unknown argument \`$1'" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
#DEBHELPER#
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
/opt/ripple/etc/rippled.cfg
|
|
||||||
/opt/ripple/etc/validators.txt
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
opt/ripple/bin/rippled
|
|
||||||
opt/ripple/bin/validator-keys
|
|
||||||
opt/ripple/bin/update-rippled.sh
|
|
||||||
opt/ripple/bin/getRippledInfo
|
|
||||||
opt/ripple/etc/rippled.cfg
|
|
||||||
opt/ripple/etc/validators.txt
|
|
||||||
opt/ripple/etc/update-rippled-cron
|
|
||||||
etc/logrotate.d/rippled
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
opt/ripple/etc/rippled.cfg etc/opt/ripple/rippled.cfg
|
|
||||||
opt/ripple/etc/validators.txt etc/opt/ripple/validators.txt
|
|
||||||
opt/ripple/bin/rippled usr/local/bin/rippled
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
USER_NAME=rippled
|
|
||||||
GROUP_NAME=rippled
|
|
||||||
case "$1" in
|
|
||||||
configure)
|
|
||||||
id -u $USER_NAME >/dev/null 2>&1 || \
|
|
||||||
adduser --system --quiet \
|
|
||||||
--home /nonexistent --no-create-home \
|
|
||||||
--disabled-password \
|
|
||||||
--group "$GROUP_NAME"
|
|
||||||
chown -R $USER_NAME:$GROUP_NAME /var/log/rippled/
|
|
||||||
chown -R $USER_NAME:$GROUP_NAME /var/lib/rippled/
|
|
||||||
chown -R $USER_NAME:$GROUP_NAME /opt/ripple
|
|
||||||
chmod 755 /var/log/rippled/
|
|
||||||
chmod 755 /var/lib/rippled/
|
|
||||||
chmod 644 /opt/ripple/etc/update-rippled-cron
|
|
||||||
chmod 644 /etc/logrotate.d/rippled
|
|
||||||
chown -R root:$GROUP_NAME /opt/ripple/etc/update-rippled-cron
|
|
||||||
;;
|
|
||||||
|
|
||||||
abort-upgrade|abort-remove|abort-deconfigure)
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "postinst called with unknown argument \`$1'" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
#DEBHELPER#
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "postrm called with unknown argument \`$1'" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
#DEBHELPER#
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
install|upgrade)
|
|
||||||
;;
|
|
||||||
|
|
||||||
abort-upgrade)
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "preinst called with unknown argument \`$1'" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
#DEBHELPER#
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
remove|upgrade|deconfigure)
|
|
||||||
;;
|
|
||||||
|
|
||||||
failed-upgrade)
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "prerm called with unknown argument \`$1'" >&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
#DEBHELPER#
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
#!/usr/bin/make -f
|
|
||||||
export DH_VERBOSE = 1
|
|
||||||
export DH_OPTIONS = -v
|
|
||||||
# debuild sets some warnings that don't work well
|
|
||||||
# for our curent build..so try to remove those flags here:
|
|
||||||
export CFLAGS:=$(subst -Wformat,,$(CFLAGS))
|
|
||||||
export CFLAGS:=$(subst -Werror=format-security,,$(CFLAGS))
|
|
||||||
export CXXFLAGS:=$(subst -Wformat,,$(CXXFLAGS))
|
|
||||||
export CXXFLAGS:=$(subst -Werror=format-security,,$(CXXFLAGS))
|
|
||||||
|
|
||||||
%:
|
|
||||||
dh $@ --with systemd
|
|
||||||
|
|
||||||
override_dh_systemd_start:
|
|
||||||
dh_systemd_start --no-restart-on-upgrade
|
|
||||||
|
|
||||||
override_dh_auto_configure:
|
|
||||||
/root/.pyenv/shims/conan export external/snappy snappy/1.1.10@
|
|
||||||
/root/.pyenv/shims/conan export external/soci soci/4.0.3@
|
|
||||||
|
|
||||||
mkdir build.rippled
|
|
||||||
|
|
||||||
cd build.rippled && \
|
|
||||||
/root/.pyenv/shims/conan install .. \
|
|
||||||
--profile gcc \
|
|
||||||
--output-folder . \
|
|
||||||
--build missing \
|
|
||||||
--settings build_type=Release
|
|
||||||
|
|
||||||
cd build.rippled && \
|
|
||||||
cmake .. \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-Dvalidator_keys=ON \
|
|
||||||
-DCMAKE_VERBOSE_MAKEFILE=ON \
|
|
||||||
-DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake
|
|
||||||
|
|
||||||
mkdir build.rippled-reporting
|
|
||||||
|
|
||||||
cd build.rippled-reporting && \
|
|
||||||
/root/.pyenv/shims/conan install .. \
|
|
||||||
--profile gcc \
|
|
||||||
--output-folder . \
|
|
||||||
--settings compiler.cppstd=17 \
|
|
||||||
--settings build_type=Release \
|
|
||||||
--build missing \
|
|
||||||
--build boost \
|
|
||||||
--build sqlite3 \
|
|
||||||
--build libuv \
|
|
||||||
--options reporting=True
|
|
||||||
|
|
||||||
cd build.rippled-reporting && \
|
|
||||||
cmake .. \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-Dvalidator_keys=ON \
|
|
||||||
-Dstatic=ON \
|
|
||||||
-Dunity=OFF \
|
|
||||||
-Dreporting=ON \
|
|
||||||
-DCMAKE_VERBOSE_MAKEFILE=ON \
|
|
||||||
-DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake
|
|
||||||
|
|
||||||
override_dh_auto_build:
|
|
||||||
cmake --build build.rippled --target rippled --target validator-keys --parallel 8
|
|
||||||
cmake --build build.rippled-reporting --target rippled --parallel 8
|
|
||||||
|
|
||||||
override_dh_auto_install:
|
|
||||||
cmake --install build.rippled --prefix debian/tmp/opt/ripple
|
|
||||||
install -D build.rippled/validator-keys/validator-keys debian/tmp/opt/ripple/bin/validator-keys
|
|
||||||
install -D Builds/containers/shared/update-rippled.sh debian/tmp/opt/ripple/bin/update-rippled.sh
|
|
||||||
install -D bin/getRippledInfo debian/tmp/opt/ripple/bin/getRippledInfo
|
|
||||||
install -D Builds/containers/shared/update-rippled-cron debian/tmp/opt/ripple/etc/update-rippled-cron
|
|
||||||
install -D Builds/containers/shared/rippled-logrotate debian/tmp/etc/logrotate.d/rippled
|
|
||||||
rm -rf debian/tmp/opt/ripple/lib64/cmake/date
|
|
||||||
|
|
||||||
mkdir -p debian/tmp/opt/rippled-reporting/etc
|
|
||||||
mkdir -p debian/tmp/opt/rippled-reporting/bin
|
|
||||||
cp cfg/validators-example.txt debian/tmp/opt/rippled-reporting/etc/validators.txt
|
|
||||||
|
|
||||||
sed -E 's/rippled?/rippled-reporting/g' Builds/containers/shared/update-rippled.sh > debian/tmp/opt/rippled-reporting/bin/update-rippled-reporting.sh
|
|
||||||
sed -E 's/rippled?/rippled-reporting/g' bin/getRippledInfo > debian/tmp/opt/rippled-reporting/bin/getRippledReportingInfo
|
|
||||||
sed -E 's/rippled?/rippled-reporting/g' Builds/containers/shared/update-rippled-cron > debian/tmp/opt/rippled-reporting/etc/update-rippled-reporting-cron
|
|
||||||
sed -E 's/rippled?/rippled-reporting/g' Builds/containers/shared/rippled-logrotate > debian/tmp/etc/logrotate.d/rippled-reporting
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
3.0 (quilt)
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
#abort-on-upstream-changes
|
|
||||||
#unapply-patches
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
enable rippled-reporting.service
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
enable rippled.service
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
cd /opt/rippled_bld/pkg
|
|
||||||
cp -fpu rippled/Builds/containers/packaging/rpm/rippled.spec .
|
|
||||||
cp -fpu rippled/Builds/containers/shared/update_sources.sh .
|
|
||||||
source update_sources.sh
|
|
||||||
|
|
||||||
# Build the rpm
|
|
||||||
|
|
||||||
IFS='-' read -r RIPPLED_RPM_VERSION RELEASE <<< "$RIPPLED_VERSION"
|
|
||||||
export RIPPLED_RPM_VERSION
|
|
||||||
|
|
||||||
RPM_RELEASE=${RPM_RELEASE-1}
|
|
||||||
|
|
||||||
# post-release version
|
|
||||||
if [ "hf" = "$(echo "$RELEASE" | cut -c -2)" ]; then
|
|
||||||
RPM_RELEASE="${RPM_RELEASE}.${RELEASE}"
|
|
||||||
# pre-release version (-b or -rc)
|
|
||||||
elif [[ $RELEASE ]]; then
|
|
||||||
RPM_RELEASE="0.${RPM_RELEASE}.${RELEASE}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
export RPM_RELEASE
|
|
||||||
|
|
||||||
if [[ $RPM_PATCH ]]; then
|
|
||||||
RPM_PATCH=".${RPM_PATCH}"
|
|
||||||
export RPM_PATCH
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd /opt/rippled_bld/pkg/rippled
|
|
||||||
|
|
||||||
if [[ -n $(git status --porcelain) ]]; then
|
|
||||||
git status
|
|
||||||
error "Unstaged changes in this repo - please commit first"
|
|
||||||
fi
|
|
||||||
|
|
||||||
git archive --format tar.gz --prefix rippled/ -o ../rpmbuild/SOURCES/rippled.tar.gz HEAD
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
source /opt/rh/devtoolset-11/enable
|
|
||||||
|
|
||||||
rpmbuild --define "_topdir ${PWD}/rpmbuild" -ba rippled.spec
|
|
||||||
|
|
||||||
rc=$?; if [[ $rc != 0 ]]; then
|
|
||||||
error "error building rpm"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Make a tar of the rpm and source rpm
|
|
||||||
RPM_VERSION_RELEASE=$(rpm -qp --qf='%{NAME}-%{VERSION}-%{RELEASE}' ./rpmbuild/RPMS/x86_64/rippled-[0-9]*.rpm)
|
|
||||||
tar_file=$RPM_VERSION_RELEASE.tar.gz
|
|
||||||
|
|
||||||
cp ./rpmbuild/RPMS/x86_64/* ${PKG_OUTDIR}
|
|
||||||
cp ./rpmbuild/SRPMS/* ${PKG_OUTDIR}
|
|
||||||
|
|
||||||
RPM_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/RPMS/x86_64/rippled-[0-9]*.rpm 2>/dev/null)
|
|
||||||
DBG_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/RPMS/x86_64/rippled-debuginfo*.rpm 2>/dev/null)
|
|
||||||
DEV_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/RPMS/x86_64/rippled-devel*.rpm 2>/dev/null)
|
|
||||||
REP_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/RPMS/x86_64/rippled-reporting*.rpm 2>/dev/null)
|
|
||||||
SRC_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/SRPMS/*.rpm 2>/dev/null)
|
|
||||||
|
|
||||||
RPM_SHA256="$(sha256sum ./rpmbuild/RPMS/x86_64/rippled-[0-9]*.rpm | awk '{ print $1}')"
|
|
||||||
DBG_SHA256="$(sha256sum ./rpmbuild/RPMS/x86_64/rippled-debuginfo*.rpm | awk '{ print $1}')"
|
|
||||||
REP_SHA256="$(sha256sum ./rpmbuild/RPMS/x86_64/rippled-reporting*.rpm | awk '{ print $1}')"
|
|
||||||
DEV_SHA256="$(sha256sum ./rpmbuild/RPMS/x86_64/rippled-devel*.rpm | awk '{ print $1}')"
|
|
||||||
SRC_SHA256="$(sha256sum ./rpmbuild/SRPMS/*.rpm | awk '{ print $1}')"
|
|
||||||
|
|
||||||
echo "rpm_md5sum=$RPM_MD5SUM" > ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "rep_md5sum=$REP_MD5SUM" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "dbg_md5sum=$DBG_MD5SUM" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "dev_md5sum=$DEV_MD5SUM" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "src_md5sum=$SRC_MD5SUM" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "rpm_sha256=$RPM_SHA256" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "rep_sha256=$REP_SHA256" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "dbg_sha256=$DBG_SHA256" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "dev_sha256=$DEV_SHA256" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "src_sha256=$SRC_SHA256" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "rippled_version=$RIPPLED_VERSION" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "rpm_version=$RIPPLED_RPM_VERSION" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "rpm_file_name=$tar_file" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
echo "rpm_version_release=$RPM_VERSION_RELEASE" >> ${PKG_OUTDIR}/build_vars
|
|
||||||
@@ -1,239 +0,0 @@
|
|||||||
%define rippled_version %(echo $RIPPLED_RPM_VERSION)
|
|
||||||
%define rpm_release %(echo $RPM_RELEASE)
|
|
||||||
%define rpm_patch %(echo $RPM_PATCH)
|
|
||||||
%define _prefix /opt/ripple
|
|
||||||
|
|
||||||
Name: rippled
|
|
||||||
# Dashes in Version extensions must be converted to underscores
|
|
||||||
Version: %{rippled_version}
|
|
||||||
Release: %{rpm_release}%{?dist}%{rpm_patch}
|
|
||||||
Summary: rippled daemon
|
|
||||||
|
|
||||||
License: MIT
|
|
||||||
URL: http://ripple.com/
|
|
||||||
Source0: rippled.tar.gz
|
|
||||||
|
|
||||||
BuildRequires: cmake zlib-static ninja-build
|
|
||||||
|
|
||||||
%description
|
|
||||||
rippled
|
|
||||||
|
|
||||||
%package devel
|
|
||||||
Summary: Files for development of applications using xrpl core library
|
|
||||||
Group: Development/Libraries
|
|
||||||
Requires: zlib-static
|
|
||||||
|
|
||||||
%description devel
|
|
||||||
core library for development of standalone applications that sign transactions.
|
|
||||||
|
|
||||||
%package reporting
|
|
||||||
Summary: Reporting Server for rippled
|
|
||||||
|
|
||||||
%description reporting
|
|
||||||
History server for XRP Ledger
|
|
||||||
|
|
||||||
%prep
|
|
||||||
%setup -c -n rippled
|
|
||||||
|
|
||||||
%build
|
|
||||||
|
|
||||||
source /opt/rh/devtoolset-11/enable
|
|
||||||
source /opt/rh/rh-python38/enable
|
|
||||||
|
|
||||||
pip install "conan<2"
|
|
||||||
|
|
||||||
conan profile new default --detect
|
|
||||||
conan profile update settings.compiler.cppstd=20 default
|
|
||||||
conan profile update settings.compiler.libcxx=libstdc++11 default
|
|
||||||
|
|
||||||
cd rippled
|
|
||||||
|
|
||||||
conan export external/snappy snappy/1.1.10@
|
|
||||||
conan export external/soci soci/4.0.3@
|
|
||||||
|
|
||||||
mkdir -p bld.rippled
|
|
||||||
pushd bld.rippled
|
|
||||||
|
|
||||||
cp /opt/libcstd/libstdc++.so.6.0.22 /usr/lib64
|
|
||||||
cp /opt/libcstd/libstdc++.so.6.0.22 /lib64
|
|
||||||
ln -sf /usr/lib64/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6
|
|
||||||
ln -sf /lib64/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6
|
|
||||||
|
|
||||||
conan install .. \
|
|
||||||
--profile default \
|
|
||||||
--output-folder . \
|
|
||||||
--build missing \
|
|
||||||
--settings build_type=Release
|
|
||||||
|
|
||||||
cmake .. \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-Dvalidator_keys=ON \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=%{_prefix} \
|
|
||||||
-DCMAKE_VERBOSE_MAKEFILE=ON \
|
|
||||||
-DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake
|
|
||||||
|
|
||||||
cmake --build . --parallel $(nproc) --target rippled --target validator-keys
|
|
||||||
|
|
||||||
popd
|
|
||||||
|
|
||||||
mkdir -p bld.rippled-reporting
|
|
||||||
pushd bld.rippled-reporting
|
|
||||||
|
|
||||||
conan install .. \
|
|
||||||
--settings build_type=Release \
|
|
||||||
--output-folder . \
|
|
||||||
--build missing \
|
|
||||||
--settings compiler.cppstd=17 \
|
|
||||||
--options reporting=True
|
|
||||||
|
|
||||||
cmake .. \
|
|
||||||
-G Ninja \
|
|
||||||
-DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=%{_prefix} \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-Dunity=OFF \
|
|
||||||
-Dstatic=ON \
|
|
||||||
-Dvalidator_keys=ON \
|
|
||||||
-Dreporting=ON \
|
|
||||||
-DCMAKE_VERBOSE_MAKEFILE=ON \
|
|
||||||
|
|
||||||
cmake --build . --parallel $(nproc) --target rippled
|
|
||||||
|
|
||||||
%pre
|
|
||||||
test -e /etc/pki/tls || { mkdir -p /etc/pki; ln -s /usr/lib/ssl /etc/pki/tls; }
|
|
||||||
|
|
||||||
%install
|
|
||||||
rm -rf $RPM_BUILD_ROOT
|
|
||||||
DESTDIR=$RPM_BUILD_ROOT cmake --build rippled/bld.rippled --target install #-- -v
|
|
||||||
mkdir -p $RPM_BUILD_ROOT
|
|
||||||
rm -rf ${RPM_BUILD_ROOT}%{_prefix}/lib64/
|
|
||||||
install -d ${RPM_BUILD_ROOT}/etc/opt/ripple
|
|
||||||
install -d ${RPM_BUILD_ROOT}/usr/local/bin
|
|
||||||
|
|
||||||
install -D ./rippled/cfg/rippled-example.cfg ${RPM_BUILD_ROOT}/%{_prefix}/etc/rippled.cfg
|
|
||||||
install -D ./rippled/cfg/validators-example.txt ${RPM_BUILD_ROOT}/%{_prefix}/etc/validators.txt
|
|
||||||
|
|
||||||
ln -sf %{_prefix}/etc/rippled.cfg ${RPM_BUILD_ROOT}/etc/opt/ripple/rippled.cfg
|
|
||||||
ln -sf %{_prefix}/etc/validators.txt ${RPM_BUILD_ROOT}/etc/opt/ripple/validators.txt
|
|
||||||
ln -sf %{_prefix}/bin/rippled ${RPM_BUILD_ROOT}/usr/local/bin/rippled
|
|
||||||
install -D rippled/bld.rippled/validator-keys/validator-keys ${RPM_BUILD_ROOT}%{_bindir}/validator-keys
|
|
||||||
install -D ./rippled/Builds/containers/shared/rippled.service ${RPM_BUILD_ROOT}/usr/lib/systemd/system/rippled.service
|
|
||||||
install -D ./rippled/Builds/containers/packaging/rpm/50-rippled.preset ${RPM_BUILD_ROOT}/usr/lib/systemd/system-preset/50-rippled.preset
|
|
||||||
install -D ./rippled/Builds/containers/shared/update-rippled.sh ${RPM_BUILD_ROOT}%{_bindir}/update-rippled.sh
|
|
||||||
install -D ./rippled/bin/getRippledInfo ${RPM_BUILD_ROOT}%{_bindir}/getRippledInfo
|
|
||||||
install -D ./rippled/Builds/containers/shared/update-rippled-cron ${RPM_BUILD_ROOT}%{_prefix}/etc/update-rippled-cron
|
|
||||||
install -D ./rippled/Builds/containers/shared/rippled-logrotate ${RPM_BUILD_ROOT}/etc/logrotate.d/rippled
|
|
||||||
install -d $RPM_BUILD_ROOT/var/log/rippled
|
|
||||||
install -d $RPM_BUILD_ROOT/var/lib/rippled
|
|
||||||
|
|
||||||
# reporting mode
|
|
||||||
%define _prefix /opt/rippled-reporting
|
|
||||||
mkdir -p ${RPM_BUILD_ROOT}/etc/opt/rippled-reporting/
|
|
||||||
install -D rippled/bld.rippled-reporting/rippled-reporting ${RPM_BUILD_ROOT}%{_bindir}/rippled-reporting
|
|
||||||
install -D ./rippled/cfg/rippled-reporting.cfg ${RPM_BUILD_ROOT}%{_prefix}/etc/rippled-reporting.cfg
|
|
||||||
install -D ./rippled/cfg/validators-example.txt ${RPM_BUILD_ROOT}%{_prefix}/etc/validators.txt
|
|
||||||
install -D ./rippled/Builds/containers/packaging/rpm/50-rippled-reporting.preset ${RPM_BUILD_ROOT}/usr/lib/systemd/system-preset/50-rippled-reporting.preset
|
|
||||||
ln -sf %{_prefix}/bin/rippled-reporting ${RPM_BUILD_ROOT}/usr/local/bin/rippled-reporting
|
|
||||||
ln -sf %{_prefix}/etc/rippled-reporting.cfg ${RPM_BUILD_ROOT}/etc/opt/rippled-reporting/rippled-reporting.cfg
|
|
||||||
ln -sf %{_prefix}/etc/validators.txt ${RPM_BUILD_ROOT}/etc/opt/rippled-reporting/validators.txt
|
|
||||||
install -d $RPM_BUILD_ROOT/var/log/rippled-reporting
|
|
||||||
install -d $RPM_BUILD_ROOT/var/lib/rippled-reporting
|
|
||||||
install -D ./rippled/Builds/containers/shared/rippled-reporting.service ${RPM_BUILD_ROOT}/usr/lib/systemd/system/rippled-reporting.service
|
|
||||||
sed -E 's/rippled?/rippled-reporting/g' ./rippled/Builds/containers/shared/update-rippled.sh > ${RPM_BUILD_ROOT}%{_bindir}/update-rippled-reporting.sh
|
|
||||||
sed -E 's/rippled?/rippled-reporting/g' ./rippled/bin/getRippledInfo > ${RPM_BUILD_ROOT}%{_bindir}/getRippledReportingInfo
|
|
||||||
sed -E 's/rippled?/rippled-reporting/g' ./rippled/Builds/containers/shared/update-rippled-cron > ${RPM_BUILD_ROOT}%{_prefix}/etc/update-rippled-reporting-cron
|
|
||||||
sed -E 's/rippled?/rippled-reporting/g' ./rippled/Builds/containers/shared/rippled-logrotate > ${RPM_BUILD_ROOT}/etc/logrotate.d/rippled-reporting
|
|
||||||
|
|
||||||
|
|
||||||
%post
|
|
||||||
%define _prefix /opt/ripple
|
|
||||||
USER_NAME=rippled
|
|
||||||
GROUP_NAME=rippled
|
|
||||||
|
|
||||||
getent passwd $USER_NAME &>/dev/null || useradd $USER_NAME
|
|
||||||
getent group $GROUP_NAME &>/dev/null || groupadd $GROUP_NAME
|
|
||||||
|
|
||||||
chown -R $USER_NAME:$GROUP_NAME /var/log/rippled/
|
|
||||||
chown -R $USER_NAME:$GROUP_NAME /var/lib/rippled/
|
|
||||||
chown -R $USER_NAME:$GROUP_NAME %{_prefix}/
|
|
||||||
|
|
||||||
chmod 755 /var/log/rippled/
|
|
||||||
chmod 755 /var/lib/rippled/
|
|
||||||
|
|
||||||
chmod 644 %{_prefix}/etc/update-rippled-cron
|
|
||||||
chmod 644 /etc/logrotate.d/rippled
|
|
||||||
chown -R root:$GROUP_NAME %{_prefix}/etc/update-rippled-cron
|
|
||||||
|
|
||||||
%post reporting
|
|
||||||
%define _prefix /opt/rippled-reporting
|
|
||||||
USER_NAME=rippled-reporting
|
|
||||||
GROUP_NAME=rippled-reporting
|
|
||||||
|
|
||||||
getent passwd $USER_NAME &>/dev/null || useradd -r $USER_NAME
|
|
||||||
getent group $GROUP_NAME &>/dev/null || groupadd $GROUP_NAME
|
|
||||||
|
|
||||||
chown -R $USER_NAME:$GROUP_NAME /var/log/rippled-reporting/
|
|
||||||
chown -R $USER_NAME:$GROUP_NAME /var/lib/rippled-reporting/
|
|
||||||
chown -R $USER_NAME:$GROUP_NAME %{_prefix}/
|
|
||||||
|
|
||||||
chmod 755 /var/log/rippled-reporting/
|
|
||||||
chmod 755 /var/lib/rippled-reporting/
|
|
||||||
chmod -x /usr/lib/systemd/system/rippled-reporting.service
|
|
||||||
|
|
||||||
|
|
||||||
%files
|
|
||||||
%define _prefix /opt/ripple
|
|
||||||
%doc rippled/README.md rippled/LICENSE.md
|
|
||||||
%{_bindir}/rippled
|
|
||||||
/usr/local/bin/rippled
|
|
||||||
%{_bindir}/update-rippled.sh
|
|
||||||
%{_bindir}/getRippledInfo
|
|
||||||
%{_prefix}/etc/update-rippled-cron
|
|
||||||
%{_bindir}/validator-keys
|
|
||||||
%config(noreplace) %{_prefix}/etc/rippled.cfg
|
|
||||||
%config(noreplace) /etc/opt/ripple/rippled.cfg
|
|
||||||
%config(noreplace) %{_prefix}/etc/validators.txt
|
|
||||||
%config(noreplace) /etc/opt/ripple/validators.txt
|
|
||||||
%config(noreplace) /etc/logrotate.d/rippled
|
|
||||||
%config(noreplace) /usr/lib/systemd/system/rippled.service
|
|
||||||
%config(noreplace) /usr/lib/systemd/system-preset/50-rippled.preset
|
|
||||||
|
|
||||||
%dir /var/log/rippled/
|
|
||||||
%dir /var/lib/rippled/
|
|
||||||
|
|
||||||
%files devel
|
|
||||||
%{_prefix}/include
|
|
||||||
%{_prefix}/lib/*.a
|
|
||||||
%{_prefix}/lib/cmake/ripple
|
|
||||||
|
|
||||||
%files reporting
|
|
||||||
%define _prefix /opt/rippled-reporting
|
|
||||||
%doc rippled/README.md rippled/LICENSE.md
|
|
||||||
|
|
||||||
%{_bindir}/rippled-reporting
|
|
||||||
/usr/local/bin/rippled-reporting
|
|
||||||
%config(noreplace) /etc/opt/rippled-reporting/rippled-reporting.cfg
|
|
||||||
%config(noreplace) %{_prefix}/etc/rippled-reporting.cfg
|
|
||||||
%config(noreplace) %{_prefix}/etc/validators.txt
|
|
||||||
%config(noreplace) /etc/opt/rippled-reporting/validators.txt
|
|
||||||
%config(noreplace) /usr/lib/systemd/system/rippled-reporting.service
|
|
||||||
%config(noreplace) /usr/lib/systemd/system-preset/50-rippled-reporting.preset
|
|
||||||
%dir /var/log/rippled-reporting/
|
|
||||||
%dir /var/lib/rippled-reporting/
|
|
||||||
%{_bindir}/update-rippled-reporting.sh
|
|
||||||
%{_bindir}/getRippledReportingInfo
|
|
||||||
%{_prefix}/etc/update-rippled-reporting-cron
|
|
||||||
%config(noreplace) /etc/logrotate.d/rippled-reporting
|
|
||||||
|
|
||||||
%changelog
|
|
||||||
* Wed Aug 28 2019 Mike Ellery <mellery451@gmail.com>
|
|
||||||
- Switch to subproject build for validator-keys
|
|
||||||
|
|
||||||
* Wed May 15 2019 Mike Ellery <mellery451@gmail.com>
|
|
||||||
- Make validator-keys use local rippled build for core lib
|
|
||||||
|
|
||||||
* Wed Aug 01 2018 Mike Ellery <mellery451@gmail.com>
|
|
||||||
- add devel package for signing library
|
|
||||||
|
|
||||||
* Thu Jun 02 2016 Brandon Wilson <bwilson@ripple.com>
|
|
||||||
- Install validators.txt
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
IFS=. read cm_maj cm_min cm_rel <<<"$1"
|
|
||||||
: ${cm_rel:-0}
|
|
||||||
CMAKE_ROOT=${2:-"${HOME}/cmake"}
|
|
||||||
|
|
||||||
function cmake_version ()
|
|
||||||
{
|
|
||||||
if [[ -d ${CMAKE_ROOT} ]] ; then
|
|
||||||
local perms=$(test $(uname) = "Linux" && echo "/111" || echo "+111")
|
|
||||||
local installed=$(find ${CMAKE_ROOT} -perm ${perms} -type f -name cmake)
|
|
||||||
if [[ "${installed}" != "" ]] ; then
|
|
||||||
echo "$(${installed} --version | head -1)"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
installed=$(cmake_version)
|
|
||||||
if [[ "${installed}" != "" && ${installed} =~ ${cm_maj}.${cm_min}.${cm_rel} ]] ; then
|
|
||||||
echo "cmake already installed: ${installed}"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
# From CMake 20+ "Linux" is lowercase so using `uname` won't create be the correct path
|
|
||||||
if [ ${cm_min} -gt 19 ]; then
|
|
||||||
linux="linux"
|
|
||||||
else
|
|
||||||
linux=$(uname)
|
|
||||||
fi
|
|
||||||
pkgname="cmake-${cm_maj}.${cm_min}.${cm_rel}-${linux}-x86_64.tar.gz"
|
|
||||||
tmppkg="/tmp/cmake.tar.gz"
|
|
||||||
wget --quiet https://cmake.org/files/v${cm_maj}.${cm_min}/${pkgname} -O ${tmppkg}
|
|
||||||
mkdir -p ${CMAKE_ROOT}
|
|
||||||
cd ${CMAKE_ROOT}
|
|
||||||
tar --strip-components 1 -xf ${tmppkg}
|
|
||||||
rm -f ${tmppkg}
|
|
||||||
echo "installed: $(cmake_version)"
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
/var/log/rippled/*.log {
|
|
||||||
daily
|
|
||||||
minsize 200M
|
|
||||||
rotate 7
|
|
||||||
nocreate
|
|
||||||
missingok
|
|
||||||
notifempty
|
|
||||||
compress
|
|
||||||
compresscmd /usr/bin/nice
|
|
||||||
compressoptions -n19 ionice -c3 gzip
|
|
||||||
compressext .gz
|
|
||||||
postrotate
|
|
||||||
/opt/ripple/bin/rippled --conf /opt/ripple/etc/rippled.cfg logrotate
|
|
||||||
endscript
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
[Unit]
|
|
||||||
Description=Ripple Daemon
|
|
||||||
After=network-online.target
|
|
||||||
Wants=network-online.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
ExecStart=/opt/rippled-reporting/bin/rippled-reporting --silent --conf /etc/opt/rippled-reporting/rippled-reporting.cfg
|
|
||||||
Restart=on-failure
|
|
||||||
User=rippled-reporting
|
|
||||||
Group=rippled-reporting
|
|
||||||
LimitNOFILE=65536
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
[Unit]
|
|
||||||
Description=Ripple Daemon
|
|
||||||
After=network-online.target
|
|
||||||
Wants=network-online.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
ExecStart=/opt/ripple/bin/rippled --net --silent --conf /etc/opt/ripple/rippled.cfg
|
|
||||||
Restart=on-failure
|
|
||||||
User=rippled
|
|
||||||
Group=rippled
|
|
||||||
LimitNOFILE=65536
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# For automatic updates, symlink this file to /etc/cron.d/
|
|
||||||
# Do not remove the newline at the end of this cron script
|
|
||||||
|
|
||||||
# bash required for use of RANDOM below.
|
|
||||||
SHELL=/bin/bash
|
|
||||||
PATH=/sbin;/bin;/usr/sbin;/usr/bin
|
|
||||||
|
|
||||||
# invoke check/update script with random delay up to 59 mins
|
|
||||||
0 * * * * root sleep $((RANDOM*3540/32768)) && /opt/ripple/bin/update-rippled.sh
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
# auto-update script for rippled daemon
|
|
||||||
|
|
||||||
# Check for sudo/root permissions
|
|
||||||
if [[ $(id -u) -ne 0 ]] ; then
|
|
||||||
echo "This update script must be run as root or sudo"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
LOCKDIR=/tmp/rippleupdate.lock
|
|
||||||
UPDATELOG=/var/log/rippled/update.log
|
|
||||||
|
|
||||||
function cleanup {
|
|
||||||
# If this directory isn't removed, future updates will fail.
|
|
||||||
rmdir $LOCKDIR
|
|
||||||
}
|
|
||||||
|
|
||||||
# Use mkdir to check if process is already running. mkdir is atomic, as against file create.
|
|
||||||
if ! mkdir $LOCKDIR 2>/dev/null; then
|
|
||||||
echo $(date -u) "lockdir exists - won't proceed." >> $UPDATELOG
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
trap cleanup EXIT
|
|
||||||
|
|
||||||
source /etc/os-release
|
|
||||||
can_update=false
|
|
||||||
|
|
||||||
if [[ "$ID" == "ubuntu" || "$ID" == "debian" ]] ; then
|
|
||||||
# Silent update
|
|
||||||
apt-get update -qq
|
|
||||||
|
|
||||||
# The next line is an "awk"ward way to check if the package needs to be updated.
|
|
||||||
RIPPLE=$(apt-get install -s --only-upgrade rippled | awk '/^Inst/ { print $2 }')
|
|
||||||
test "$RIPPLE" == "rippled" && can_update=true
|
|
||||||
|
|
||||||
function apply_update {
|
|
||||||
apt-get install rippled -qq
|
|
||||||
}
|
|
||||||
elif [[ "$ID" == "fedora" || "$ID" == "centos" || "$ID" == "rhel" || "$ID" == "scientific" ]] ; then
|
|
||||||
RIPPLE_REPO=${RIPPLE_REPO-stable}
|
|
||||||
yum --disablerepo=* --enablerepo=ripple-$RIPPLE_REPO clean expire-cache
|
|
||||||
|
|
||||||
yum check-update -q --enablerepo=ripple-$RIPPLE_REPO rippled || can_update=true
|
|
||||||
|
|
||||||
function apply_update {
|
|
||||||
yum update -y --enablerepo=ripple-$RIPPLE_REPO rippled
|
|
||||||
}
|
|
||||||
else
|
|
||||||
echo "unrecognized distro!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Do the actual update and restart the service after reloading systemctl daemon.
|
|
||||||
if [ "$can_update" = true ] ; then
|
|
||||||
exec 3>&1 1>>${UPDATELOG} 2>&1
|
|
||||||
set -e
|
|
||||||
apply_update
|
|
||||||
systemctl daemon-reload
|
|
||||||
systemctl restart rippled.service
|
|
||||||
echo $(date -u) "rippled daemon updated."
|
|
||||||
else
|
|
||||||
echo $(date -u) "no updates available" >> $UPDATELOG
|
|
||||||
fi
|
|
||||||
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
function error {
|
|
||||||
echo $1
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
cd /opt/rippled_bld/pkg/rippled
|
|
||||||
export RIPPLED_VERSION=$(egrep -i -o "\b(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-[0-9a-z\-]+(\.[0-9a-z\-]+)*)?(\+[0-9a-z\-]+(\.[0-9a-z\-]+)*)?\b" src/ripple/protocol/impl/BuildInfo.cpp)
|
|
||||||
|
|
||||||
: ${PKG_OUTDIR:=/opt/rippled_bld/pkg/out}
|
|
||||||
export PKG_OUTDIR
|
|
||||||
if [ ! -d ${PKG_OUTDIR} ]; then
|
|
||||||
error "${PKG_OUTDIR} is not mounted"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -x ${OPENSSL_ROOT}/bin/openssl ]; then
|
|
||||||
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${OPENSSL_ROOT}/lib ${OPENSSL_ROOT}/bin/openssl version -a
|
|
||||||
fi
|
|
||||||
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
ARG DIST_TAG=18.04
|
|
||||||
FROM ubuntu:$DIST_TAG
|
|
||||||
ARG GIT_COMMIT=unknown
|
|
||||||
ARG CI_USE=false
|
|
||||||
LABEL git-commit=$GIT_COMMIT
|
|
||||||
|
|
||||||
WORKDIR /root
|
|
||||||
COPY ubuntu-builder/ubuntu_setup.sh .
|
|
||||||
COPY ubuntu-builder/ubuntu_setup2.sh .
|
|
||||||
|
|
||||||
RUN ./ubuntu_setup.sh && rm ubuntu_setup.sh
|
|
||||||
|
|
||||||
RUN ./ubuntu_setup2.sh && rm ubuntu_setup2.sh
|
|
||||||
|
|
||||||
COPY ubuntu-builder/ubuntu_setup3.sh .
|
|
||||||
RUN ./ubuntu_setup3.sh && rm ubuntu_setup3.sh
|
|
||||||
|
|
||||||
RUN mkdir -m 777 -p /opt/rippled_bld/pkg/
|
|
||||||
WORKDIR /opt/rippled_bld/pkg
|
|
||||||
|
|
||||||
COPY packaging/dpkg/build_dpkg.sh ./
|
|
||||||
CMD ./build_dpkg.sh
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o xtrace
|
|
||||||
|
|
||||||
# Parameters
|
|
||||||
|
|
||||||
gcc_version=${GCC_VERSION:-11}
|
|
||||||
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
|
||||||
|
|
||||||
apt update
|
|
||||||
# Iteratively build the list of packages to install so that we can interleave
|
|
||||||
# the lines with comments explaining their inclusion.
|
|
||||||
dependencies=''
|
|
||||||
# - for add-apt-repository
|
|
||||||
dependencies+=' software-properties-common'
|
|
||||||
# - to download CMake
|
|
||||||
dependencies+=' curl'
|
|
||||||
# - to build CMake
|
|
||||||
dependencies+=' libssl-dev'
|
|
||||||
# - for Python
|
|
||||||
dependencies+=' libbz2-dev liblzma-dev libsqlite3-dev'
|
|
||||||
# - to download rippled
|
|
||||||
dependencies+=' git'
|
|
||||||
# - CMake generators (but not CMake itself)
|
|
||||||
dependencies+=' make ninja-build'
|
|
||||||
apt-get install --yes ${dependencies}
|
|
||||||
|
|
||||||
add-apt-repository --yes ppa:ubuntu-toolchain-r/test
|
|
||||||
apt-get install --yes gcc-${gcc_version} g++-${gcc_version}
|
|
||||||
apt-get install --yes build-essential libssl-dev zlib1g-dev \
|
|
||||||
libbz2-dev libreadline-dev libsqlite3-dev curl \
|
|
||||||
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
|
|
||||||
|
|
||||||
# Give us nice unversioned aliases for gcc and company.
|
|
||||||
update-alternatives --install \
|
|
||||||
/usr/bin/gcc gcc /usr/bin/gcc-${gcc_version} 100 \
|
|
||||||
--slave /usr/bin/g++ g++ /usr/bin/g++-${gcc_version} \
|
|
||||||
--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-${gcc_version} \
|
|
||||||
--slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-${gcc_version} \
|
|
||||||
--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-${gcc_version} \
|
|
||||||
--slave /usr/bin/gcov gcov /usr/bin/gcov-${gcc_version} \
|
|
||||||
--slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-dump-${gcc_version} \
|
|
||||||
--slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-tool-${gcc_version}
|
|
||||||
update-alternatives --auto gcc
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o xtrace
|
|
||||||
|
|
||||||
# Parameters
|
|
||||||
|
|
||||||
gcc_version=${GCC_VERSION:-11}
|
|
||||||
cmake_version=${CMAKE_VERSION:-3.25.1}
|
|
||||||
cmake_sha256=1c511d09516af493694ed9baf13c55947a36389674d657a2d5e0ccedc6b291d8
|
|
||||||
conan_version=${CONAN_VERSION:-1.60}
|
|
||||||
|
|
||||||
curl https://pyenv.run | bash
|
|
||||||
export PYENV_ROOT="$HOME/.pyenv"
|
|
||||||
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
|
|
||||||
eval "$(pyenv init -)"
|
|
||||||
|
|
||||||
pyenv install 3.11.2
|
|
||||||
pyenv global 3.11.2
|
|
||||||
|
|
||||||
# Download and unpack CMake.
|
|
||||||
cmake_slug="cmake-${cmake_version}"
|
|
||||||
cmake_archive="${cmake_slug}.tar.gz"
|
|
||||||
curl --location --remote-name \
|
|
||||||
"https://github.com/Kitware/CMake/releases/download/v${cmake_version}/${cmake_archive}"
|
|
||||||
echo "${cmake_sha256} ${cmake_archive}" | sha256sum --check
|
|
||||||
tar -xzf ${cmake_archive}
|
|
||||||
rm ${cmake_archive}
|
|
||||||
|
|
||||||
# Build and install CMake.
|
|
||||||
cd ${cmake_slug}
|
|
||||||
./bootstrap --parallel=$(nproc)
|
|
||||||
make --jobs $(nproc)
|
|
||||||
make install
|
|
||||||
cd ..
|
|
||||||
rm --recursive --force ${cmake_slug}
|
|
||||||
|
|
||||||
# Install Conan.
|
|
||||||
pip install --upgrade pip
|
|
||||||
pip install conan==${conan_version}
|
|
||||||
|
|
||||||
conan profile new --detect gcc
|
|
||||||
conan profile update settings.compiler=gcc gcc
|
|
||||||
conan profile update settings.compiler.version=${gcc_version} gcc
|
|
||||||
conan profile update settings.compiler.libcxx=libstdc++11 gcc
|
|
||||||
conan profile update settings.compiler.cppstd=20 gcc
|
|
||||||
conan profile update env.CC=/usr/bin/gcc gcc
|
|
||||||
conan profile update env.CXX=/usr/bin/g++ gcc
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -o errexit
|
|
||||||
set -o nounset
|
|
||||||
set -o xtrace
|
|
||||||
|
|
||||||
apt-get install --yes build-essential fakeroot devscripts cmake debhelper dh-systemd
|
|
||||||
@@ -13,12 +13,15 @@ then
|
|||||||
git clean -ix
|
git clean -ix
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Ensure all sorting is ASCII-order consistently across platforms.
|
||||||
|
export LANG=C
|
||||||
|
|
||||||
rm -rfv results
|
rm -rfv results
|
||||||
mkdir results
|
mkdir results
|
||||||
includes="$( pwd )/results/rawincludes.txt"
|
includes="$( pwd )/results/rawincludes.txt"
|
||||||
pushd ../..
|
pushd ../..
|
||||||
echo Raw includes:
|
echo Raw includes:
|
||||||
grep -r '#include.*/.*\.h' src/ripple/ src/test/ | \
|
grep -r '^[ ]*#include.*/.*\.h' include src | \
|
||||||
grep -v boost | tee ${includes}
|
grep -v boost | tee ${includes}
|
||||||
popd
|
popd
|
||||||
pushd results
|
pushd results
|
||||||
|
|||||||
@@ -1,51 +1,42 @@
|
|||||||
Loop: ripple.app ripple.core
|
|
||||||
ripple.app > ripple.core
|
|
||||||
|
|
||||||
Loop: ripple.app ripple.ledger
|
|
||||||
ripple.app > ripple.ledger
|
|
||||||
|
|
||||||
Loop: ripple.app ripple.net
|
|
||||||
ripple.app > ripple.net
|
|
||||||
|
|
||||||
Loop: ripple.app ripple.nodestore
|
|
||||||
ripple.app > ripple.nodestore
|
|
||||||
|
|
||||||
Loop: ripple.app ripple.overlay
|
|
||||||
ripple.overlay ~= ripple.app
|
|
||||||
|
|
||||||
Loop: ripple.app ripple.peerfinder
|
|
||||||
ripple.app > ripple.peerfinder
|
|
||||||
|
|
||||||
Loop: ripple.app ripple.rpc
|
|
||||||
ripple.rpc > ripple.app
|
|
||||||
|
|
||||||
Loop: ripple.app ripple.shamap
|
|
||||||
ripple.app > ripple.shamap
|
|
||||||
|
|
||||||
Loop: ripple.basics ripple.core
|
|
||||||
ripple.core > ripple.basics
|
|
||||||
|
|
||||||
Loop: ripple.basics ripple.json
|
|
||||||
ripple.json ~= ripple.basics
|
|
||||||
|
|
||||||
Loop: ripple.basics ripple.protocol
|
|
||||||
ripple.protocol > ripple.basics
|
|
||||||
|
|
||||||
Loop: ripple.core ripple.net
|
|
||||||
ripple.net > ripple.core
|
|
||||||
|
|
||||||
Loop: ripple.net ripple.rpc
|
|
||||||
ripple.rpc > ripple.net
|
|
||||||
|
|
||||||
Loop: ripple.nodestore ripple.overlay
|
|
||||||
ripple.overlay ~= ripple.nodestore
|
|
||||||
|
|
||||||
Loop: ripple.overlay ripple.rpc
|
|
||||||
ripple.rpc ~= ripple.overlay
|
|
||||||
|
|
||||||
Loop: test.jtx test.toplevel
|
Loop: test.jtx test.toplevel
|
||||||
test.toplevel > test.jtx
|
test.toplevel > test.jtx
|
||||||
|
|
||||||
Loop: test.jtx test.unit_test
|
Loop: test.jtx test.unit_test
|
||||||
test.unit_test == test.jtx
|
test.unit_test == test.jtx
|
||||||
|
|
||||||
|
Loop: xrpld.app xrpld.core
|
||||||
|
xrpld.app > xrpld.core
|
||||||
|
|
||||||
|
Loop: xrpld.app xrpld.ledger
|
||||||
|
xrpld.app > xrpld.ledger
|
||||||
|
|
||||||
|
Loop: xrpld.app xrpld.net
|
||||||
|
xrpld.app > xrpld.net
|
||||||
|
|
||||||
|
Loop: xrpld.app xrpld.overlay
|
||||||
|
xrpld.overlay > xrpld.app
|
||||||
|
|
||||||
|
Loop: xrpld.app xrpld.peerfinder
|
||||||
|
xrpld.peerfinder ~= xrpld.app
|
||||||
|
|
||||||
|
Loop: xrpld.app xrpld.rpc
|
||||||
|
xrpld.rpc > xrpld.app
|
||||||
|
|
||||||
|
Loop: xrpld.app xrpld.shamap
|
||||||
|
xrpld.app > xrpld.shamap
|
||||||
|
|
||||||
|
Loop: xrpld.core xrpld.net
|
||||||
|
xrpld.net > xrpld.core
|
||||||
|
|
||||||
|
Loop: xrpld.core xrpld.perflog
|
||||||
|
xrpld.perflog == xrpld.core
|
||||||
|
|
||||||
|
Loop: xrpld.net xrpld.rpc
|
||||||
|
xrpld.rpc ~= xrpld.net
|
||||||
|
|
||||||
|
Loop: xrpld.overlay xrpld.rpc
|
||||||
|
xrpld.rpc ~= xrpld.overlay
|
||||||
|
|
||||||
|
Loop: xrpld.perflog xrpld.rpc
|
||||||
|
xrpld.rpc ~= xrpld.perflog
|
||||||
|
|
||||||
|
|||||||
@@ -1,230 +1,197 @@
|
|||||||
ripple.app > ripple.basics
|
libxrpl.basics > xrpl.basics
|
||||||
ripple.app > ripple.beast
|
libxrpl.crypto > xrpl.basics
|
||||||
ripple.app > ripple.conditions
|
libxrpl.json > xrpl.basics
|
||||||
ripple.app > ripple.consensus
|
libxrpl.json > xrpl.json
|
||||||
ripple.app > ripple.crypto
|
libxrpl.protocol > xrpl.basics
|
||||||
ripple.app > ripple.json
|
libxrpl.protocol > xrpl.json
|
||||||
ripple.app > ripple.protocol
|
libxrpl.protocol > xrpl.protocol
|
||||||
ripple.app > ripple.resource
|
libxrpl.resource > xrpl.basics
|
||||||
ripple.app > test.unit_test
|
libxrpl.resource > xrpl.json
|
||||||
ripple.basics > ripple.beast
|
libxrpl.resource > xrpl.resource
|
||||||
ripple.conditions > ripple.basics
|
libxrpl.server > xrpl.basics
|
||||||
ripple.conditions > ripple.protocol
|
libxrpl.server > xrpl.json
|
||||||
ripple.consensus > ripple.basics
|
libxrpl.server > xrpl.protocol
|
||||||
ripple.consensus > ripple.beast
|
libxrpl.server > xrpl.server
|
||||||
ripple.consensus > ripple.json
|
|
||||||
ripple.consensus > ripple.protocol
|
|
||||||
ripple.core > ripple.beast
|
|
||||||
ripple.core > ripple.json
|
|
||||||
ripple.core > ripple.protocol
|
|
||||||
ripple.crypto > ripple.basics
|
|
||||||
ripple.json > ripple.beast
|
|
||||||
ripple.ledger > ripple.basics
|
|
||||||
ripple.ledger > ripple.beast
|
|
||||||
ripple.ledger > ripple.core
|
|
||||||
ripple.ledger > ripple.json
|
|
||||||
ripple.ledger > ripple.protocol
|
|
||||||
ripple.net > ripple.basics
|
|
||||||
ripple.net > ripple.beast
|
|
||||||
ripple.net > ripple.json
|
|
||||||
ripple.net > ripple.protocol
|
|
||||||
ripple.net > ripple.resource
|
|
||||||
ripple.nodestore > ripple.basics
|
|
||||||
ripple.nodestore > ripple.beast
|
|
||||||
ripple.nodestore > ripple.core
|
|
||||||
ripple.nodestore > ripple.json
|
|
||||||
ripple.nodestore > ripple.protocol
|
|
||||||
ripple.nodestore > ripple.unity
|
|
||||||
ripple.overlay > ripple.basics
|
|
||||||
ripple.overlay > ripple.beast
|
|
||||||
ripple.overlay > ripple.core
|
|
||||||
ripple.overlay > ripple.json
|
|
||||||
ripple.overlay > ripple.peerfinder
|
|
||||||
ripple.overlay > ripple.protocol
|
|
||||||
ripple.overlay > ripple.resource
|
|
||||||
ripple.overlay > ripple.server
|
|
||||||
ripple.peerfinder > ripple.basics
|
|
||||||
ripple.peerfinder > ripple.beast
|
|
||||||
ripple.peerfinder > ripple.core
|
|
||||||
ripple.peerfinder > ripple.protocol
|
|
||||||
ripple.perflog > ripple.basics
|
|
||||||
ripple.perflog > ripple.beast
|
|
||||||
ripple.perflog > ripple.core
|
|
||||||
ripple.perflog > ripple.json
|
|
||||||
ripple.perflog > ripple.nodestore
|
|
||||||
ripple.perflog > ripple.protocol
|
|
||||||
ripple.perflog > ripple.rpc
|
|
||||||
ripple.protocol > ripple.beast
|
|
||||||
ripple.protocol > ripple.crypto
|
|
||||||
ripple.protocol > ripple.json
|
|
||||||
ripple.resource > ripple.basics
|
|
||||||
ripple.resource > ripple.beast
|
|
||||||
ripple.resource > ripple.json
|
|
||||||
ripple.resource > ripple.protocol
|
|
||||||
ripple.rpc > ripple.basics
|
|
||||||
ripple.rpc > ripple.beast
|
|
||||||
ripple.rpc > ripple.core
|
|
||||||
ripple.rpc > ripple.crypto
|
|
||||||
ripple.rpc > ripple.json
|
|
||||||
ripple.rpc > ripple.ledger
|
|
||||||
ripple.rpc > ripple.nodestore
|
|
||||||
ripple.rpc > ripple.protocol
|
|
||||||
ripple.rpc > ripple.resource
|
|
||||||
ripple.rpc > ripple.server
|
|
||||||
ripple.rpc > ripple.shamap
|
|
||||||
ripple.server > ripple.basics
|
|
||||||
ripple.server > ripple.beast
|
|
||||||
ripple.server > ripple.crypto
|
|
||||||
ripple.server > ripple.json
|
|
||||||
ripple.server > ripple.protocol
|
|
||||||
ripple.shamap > ripple.basics
|
|
||||||
ripple.shamap > ripple.beast
|
|
||||||
ripple.shamap > ripple.crypto
|
|
||||||
ripple.shamap > ripple.nodestore
|
|
||||||
ripple.shamap > ripple.protocol
|
|
||||||
test.app > ripple.app
|
|
||||||
test.app > ripple.basics
|
|
||||||
test.app > ripple.beast
|
|
||||||
test.app > ripple.core
|
|
||||||
test.app > ripple.json
|
|
||||||
test.app > ripple.ledger
|
|
||||||
test.app > ripple.overlay
|
|
||||||
test.app > ripple.protocol
|
|
||||||
test.app > ripple.resource
|
|
||||||
test.app > ripple.rpc
|
|
||||||
test.app > test.jtx
|
test.app > test.jtx
|
||||||
test.app > test.rpc
|
test.app > test.rpc
|
||||||
test.app > test.toplevel
|
test.app > test.toplevel
|
||||||
test.app > test.unit_test
|
test.app > test.unit_test
|
||||||
test.basics > ripple.basics
|
test.app > xrpl.basics
|
||||||
test.basics > ripple.beast
|
test.app > xrpld.app
|
||||||
test.basics > ripple.json
|
test.app > xrpld.core
|
||||||
test.basics > ripple.protocol
|
test.app > xrpld.ledger
|
||||||
test.basics > ripple.rpc
|
test.app > xrpld.nodestore
|
||||||
|
test.app > xrpld.overlay
|
||||||
|
test.app > xrpld.rpc
|
||||||
|
test.app > xrpl.json
|
||||||
|
test.app > xrpl.protocol
|
||||||
|
test.app > xrpl.resource
|
||||||
test.basics > test.jtx
|
test.basics > test.jtx
|
||||||
test.basics > test.unit_test
|
test.basics > test.unit_test
|
||||||
test.beast > ripple.basics
|
test.basics > xrpl.basics
|
||||||
test.beast > ripple.beast
|
test.basics > xrpld.perflog
|
||||||
test.conditions > ripple.basics
|
test.basics > xrpld.rpc
|
||||||
test.conditions > ripple.beast
|
test.basics > xrpl.json
|
||||||
test.conditions > ripple.conditions
|
test.basics > xrpl.protocol
|
||||||
test.consensus > ripple.app
|
test.beast > xrpl.basics
|
||||||
test.consensus > ripple.basics
|
test.conditions > xrpl.basics
|
||||||
test.consensus > ripple.beast
|
test.conditions > xrpld.conditions
|
||||||
test.consensus > ripple.consensus
|
|
||||||
test.consensus > ripple.ledger
|
|
||||||
test.consensus > test.csf
|
test.consensus > test.csf
|
||||||
test.consensus > test.toplevel
|
test.consensus > test.toplevel
|
||||||
test.consensus > test.unit_test
|
test.consensus > test.unit_test
|
||||||
test.core > ripple.basics
|
test.consensus > xrpl.basics
|
||||||
test.core > ripple.beast
|
test.consensus > xrpld.app
|
||||||
test.core > ripple.core
|
test.consensus > xrpld.consensus
|
||||||
test.core > ripple.crypto
|
test.consensus > xrpld.ledger
|
||||||
test.core > ripple.json
|
test.consensus > xrpl.json
|
||||||
test.core > ripple.server
|
|
||||||
test.core > test.jtx
|
test.core > test.jtx
|
||||||
test.core > test.toplevel
|
test.core > test.toplevel
|
||||||
test.core > test.unit_test
|
test.core > test.unit_test
|
||||||
test.csf > ripple.basics
|
test.core > xrpl.basics
|
||||||
test.csf > ripple.beast
|
test.core > xrpld.core
|
||||||
test.csf > ripple.consensus
|
test.core > xrpld.perflog
|
||||||
test.csf > ripple.json
|
test.core > xrpl.json
|
||||||
test.csf > ripple.protocol
|
test.core > xrpl.server
|
||||||
test.json > ripple.beast
|
test.csf > xrpl.basics
|
||||||
test.json > ripple.json
|
test.csf > xrpld.consensus
|
||||||
test.json > ripple.rpc
|
test.csf > xrpl.json
|
||||||
|
test.csf > xrpl.protocol
|
||||||
test.json > test.jtx
|
test.json > test.jtx
|
||||||
test.jtx > ripple.app
|
test.json > xrpl.json
|
||||||
test.jtx > ripple.basics
|
test.jtx > xrpl.basics
|
||||||
test.jtx > ripple.beast
|
test.jtx > xrpld.app
|
||||||
test.jtx > ripple.consensus
|
test.jtx > xrpld.core
|
||||||
test.jtx > ripple.core
|
test.jtx > xrpld.ledger
|
||||||
test.jtx > ripple.json
|
test.jtx > xrpld.net
|
||||||
test.jtx > ripple.ledger
|
test.jtx > xrpld.rpc
|
||||||
test.jtx > ripple.net
|
test.jtx > xrpl.json
|
||||||
test.jtx > ripple.protocol
|
test.jtx > xrpl.protocol
|
||||||
test.jtx > ripple.resource
|
test.jtx > xrpl.resource
|
||||||
test.jtx > ripple.rpc
|
test.jtx > xrpl.server
|
||||||
test.jtx > ripple.server
|
|
||||||
test.ledger > ripple.app
|
|
||||||
test.ledger > ripple.basics
|
|
||||||
test.ledger > ripple.beast
|
|
||||||
test.ledger > ripple.core
|
|
||||||
test.ledger > ripple.ledger
|
|
||||||
test.ledger > ripple.protocol
|
|
||||||
test.ledger > test.jtx
|
test.ledger > test.jtx
|
||||||
test.ledger > test.toplevel
|
test.ledger > test.toplevel
|
||||||
test.net > ripple.net
|
test.ledger > xrpl.basics
|
||||||
test.net > test.jtx
|
test.ledger > xrpld.app
|
||||||
test.net > test.toplevel
|
test.ledger > xrpld.core
|
||||||
test.net > test.unit_test
|
test.ledger > xrpld.ledger
|
||||||
test.nodestore > ripple.app
|
test.ledger > xrpl.protocol
|
||||||
test.nodestore > ripple.basics
|
|
||||||
test.nodestore > ripple.beast
|
|
||||||
test.nodestore > ripple.core
|
|
||||||
test.nodestore > ripple.nodestore
|
|
||||||
test.nodestore > ripple.protocol
|
|
||||||
test.nodestore > ripple.unity
|
|
||||||
test.nodestore > test.jtx
|
test.nodestore > test.jtx
|
||||||
test.nodestore > test.toplevel
|
test.nodestore > test.toplevel
|
||||||
test.nodestore > test.unit_test
|
test.nodestore > test.unit_test
|
||||||
test.overlay > ripple.app
|
test.nodestore > xrpl.basics
|
||||||
test.overlay > ripple.basics
|
test.nodestore > xrpld.core
|
||||||
test.overlay > ripple.beast
|
test.nodestore > xrpld.nodestore
|
||||||
test.overlay > ripple.overlay
|
test.nodestore > xrpld.unity
|
||||||
test.overlay > ripple.peerfinder
|
|
||||||
test.overlay > ripple.protocol
|
|
||||||
test.overlay > ripple.shamap
|
|
||||||
test.overlay > test.jtx
|
test.overlay > test.jtx
|
||||||
|
test.overlay > test.toplevel
|
||||||
test.overlay > test.unit_test
|
test.overlay > test.unit_test
|
||||||
test.peerfinder > ripple.basics
|
test.overlay > xrpl.basics
|
||||||
test.peerfinder > ripple.beast
|
test.overlay > xrpld.app
|
||||||
test.peerfinder > ripple.core
|
test.overlay > xrpld.overlay
|
||||||
test.peerfinder > ripple.peerfinder
|
test.overlay > xrpld.peerfinder
|
||||||
test.peerfinder > ripple.protocol
|
test.overlay > xrpld.shamap
|
||||||
|
test.overlay > xrpl.protocol
|
||||||
test.peerfinder > test.beast
|
test.peerfinder > test.beast
|
||||||
test.peerfinder > test.unit_test
|
test.peerfinder > test.unit_test
|
||||||
test.protocol > ripple.basics
|
test.peerfinder > xrpl.basics
|
||||||
test.protocol > ripple.beast
|
test.peerfinder > xrpld.core
|
||||||
test.protocol > ripple.crypto
|
test.peerfinder > xrpld.peerfinder
|
||||||
test.protocol > ripple.json
|
test.peerfinder > xrpl.protocol
|
||||||
test.protocol > ripple.protocol
|
|
||||||
test.protocol > test.toplevel
|
test.protocol > test.toplevel
|
||||||
test.resource > ripple.basics
|
test.protocol > xrpl.basics
|
||||||
test.resource > ripple.beast
|
test.protocol > xrpl.json
|
||||||
test.resource > ripple.resource
|
test.protocol > xrpl.protocol
|
||||||
test.resource > test.unit_test
|
test.resource > test.unit_test
|
||||||
test.rpc > ripple.app
|
test.resource > xrpl.basics
|
||||||
test.rpc > ripple.basics
|
test.resource > xrpl.resource
|
||||||
test.rpc > ripple.beast
|
|
||||||
test.rpc > ripple.core
|
|
||||||
test.rpc > ripple.json
|
|
||||||
test.rpc > ripple.net
|
|
||||||
test.rpc > ripple.nodestore
|
|
||||||
test.rpc > ripple.overlay
|
|
||||||
test.rpc > ripple.protocol
|
|
||||||
test.rpc > ripple.resource
|
|
||||||
test.rpc > ripple.rpc
|
|
||||||
test.rpc > test.jtx
|
test.rpc > test.jtx
|
||||||
test.rpc > test.nodestore
|
|
||||||
test.rpc > test.toplevel
|
test.rpc > test.toplevel
|
||||||
test.server > ripple.app
|
test.rpc > xrpl.basics
|
||||||
test.server > ripple.basics
|
test.rpc > xrpld.app
|
||||||
test.server > ripple.beast
|
test.rpc > xrpld.core
|
||||||
test.server > ripple.core
|
test.rpc > xrpld.net
|
||||||
test.server > ripple.json
|
test.rpc > xrpld.overlay
|
||||||
test.server > ripple.rpc
|
test.rpc > xrpld.rpc
|
||||||
test.server > ripple.server
|
test.rpc > xrpl.json
|
||||||
|
test.rpc > xrpl.protocol
|
||||||
|
test.rpc > xrpl.resource
|
||||||
test.server > test.jtx
|
test.server > test.jtx
|
||||||
test.server > test.toplevel
|
test.server > test.toplevel
|
||||||
test.server > test.unit_test
|
test.server > test.unit_test
|
||||||
test.shamap > ripple.basics
|
test.server > xrpl.basics
|
||||||
test.shamap > ripple.beast
|
test.server > xrpld.app
|
||||||
test.shamap > ripple.nodestore
|
test.server > xrpld.core
|
||||||
test.shamap > ripple.protocol
|
test.server > xrpld.rpc
|
||||||
test.shamap > ripple.shamap
|
test.server > xrpl.json
|
||||||
|
test.server > xrpl.server
|
||||||
test.shamap > test.unit_test
|
test.shamap > test.unit_test
|
||||||
test.toplevel > ripple.json
|
test.shamap > xrpl.basics
|
||||||
|
test.shamap > xrpld.nodestore
|
||||||
|
test.shamap > xrpld.shamap
|
||||||
|
test.shamap > xrpl.protocol
|
||||||
test.toplevel > test.csf
|
test.toplevel > test.csf
|
||||||
test.unit_test > ripple.basics
|
test.toplevel > xrpl.json
|
||||||
test.unit_test > ripple.beast
|
test.unit_test > xrpl.basics
|
||||||
|
tests.libxrpl > xrpl.basics
|
||||||
|
xrpl.json > xrpl.basics
|
||||||
|
xrpl.protocol > xrpl.basics
|
||||||
|
xrpl.protocol > xrpl.json
|
||||||
|
xrpl.resource > xrpl.basics
|
||||||
|
xrpl.resource > xrpl.json
|
||||||
|
xrpl.resource > xrpl.protocol
|
||||||
|
xrpl.server > xrpl.basics
|
||||||
|
xrpl.server > xrpl.json
|
||||||
|
xrpl.server > xrpl.protocol
|
||||||
|
xrpld.app > test.unit_test
|
||||||
|
xrpld.app > xrpl.basics
|
||||||
|
xrpld.app > xrpld.conditions
|
||||||
|
xrpld.app > xrpld.consensus
|
||||||
|
xrpld.app > xrpld.nodestore
|
||||||
|
xrpld.app > xrpld.perflog
|
||||||
|
xrpld.app > xrpl.json
|
||||||
|
xrpld.app > xrpl.protocol
|
||||||
|
xrpld.app > xrpl.resource
|
||||||
|
xrpld.conditions > xrpl.basics
|
||||||
|
xrpld.conditions > xrpl.protocol
|
||||||
|
xrpld.consensus > xrpl.basics
|
||||||
|
xrpld.consensus > xrpl.json
|
||||||
|
xrpld.consensus > xrpl.protocol
|
||||||
|
xrpld.core > xrpl.basics
|
||||||
|
xrpld.core > xrpl.json
|
||||||
|
xrpld.core > xrpl.protocol
|
||||||
|
xrpld.ledger > xrpl.basics
|
||||||
|
xrpld.ledger > xrpl.json
|
||||||
|
xrpld.ledger > xrpl.protocol
|
||||||
|
xrpld.net > xrpl.basics
|
||||||
|
xrpld.net > xrpl.json
|
||||||
|
xrpld.net > xrpl.protocol
|
||||||
|
xrpld.net > xrpl.resource
|
||||||
|
xrpld.nodestore > xrpl.basics
|
||||||
|
xrpld.nodestore > xrpld.core
|
||||||
|
xrpld.nodestore > xrpld.unity
|
||||||
|
xrpld.nodestore > xrpl.json
|
||||||
|
xrpld.nodestore > xrpl.protocol
|
||||||
|
xrpld.overlay > xrpl.basics
|
||||||
|
xrpld.overlay > xrpld.core
|
||||||
|
xrpld.overlay > xrpld.peerfinder
|
||||||
|
xrpld.overlay > xrpld.perflog
|
||||||
|
xrpld.overlay > xrpl.json
|
||||||
|
xrpld.overlay > xrpl.protocol
|
||||||
|
xrpld.overlay > xrpl.resource
|
||||||
|
xrpld.overlay > xrpl.server
|
||||||
|
xrpld.peerfinder > xrpl.basics
|
||||||
|
xrpld.peerfinder > xrpld.core
|
||||||
|
xrpld.peerfinder > xrpl.protocol
|
||||||
|
xrpld.perflog > xrpl.basics
|
||||||
|
xrpld.perflog > xrpl.json
|
||||||
|
xrpld.rpc > xrpl.basics
|
||||||
|
xrpld.rpc > xrpld.core
|
||||||
|
xrpld.rpc > xrpld.ledger
|
||||||
|
xrpld.rpc > xrpld.nodestore
|
||||||
|
xrpld.rpc > xrpl.json
|
||||||
|
xrpld.rpc > xrpl.protocol
|
||||||
|
xrpld.rpc > xrpl.resource
|
||||||
|
xrpld.rpc > xrpl.server
|
||||||
|
xrpld.shamap > xrpl.basics
|
||||||
|
xrpld.shamap > xrpld.nodestore
|
||||||
|
xrpld.shamap > xrpl.protocol
|
||||||
|
|||||||
@@ -9,23 +9,43 @@ endif()
|
|||||||
|
|
||||||
# Fix "unrecognized escape" issues when passing CMAKE_MODULE_PATH on Windows.
|
# Fix "unrecognized escape" issues when passing CMAKE_MODULE_PATH on Windows.
|
||||||
file(TO_CMAKE_PATH "${CMAKE_MODULE_PATH}" CMAKE_MODULE_PATH)
|
file(TO_CMAKE_PATH "${CMAKE_MODULE_PATH}" CMAKE_MODULE_PATH)
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/Builds/CMake")
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
||||||
|
|
||||||
project(rippled)
|
project(xrpl)
|
||||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
|
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
||||||
|
# GCC-specific fixes
|
||||||
|
add_compile_options(-Wno-unknown-pragmas -Wno-subobject-linkage)
|
||||||
|
# -Wno-subobject-linkage can be removed when we upgrade GCC version to at least 13.3
|
||||||
|
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||||
|
# Clang-specific fixes
|
||||||
|
add_compile_options(-Wno-unknown-warning-option) # Ignore unknown warning options
|
||||||
|
elseif(MSVC)
|
||||||
|
# MSVC-specific fixes
|
||||||
|
add_compile_options(/wd4068) # Ignore unknown pragmas
|
||||||
|
endif()
|
||||||
|
|
||||||
# make GIT_COMMIT_HASH define available to all sources
|
# make GIT_COMMIT_HASH define available to all sources
|
||||||
find_package(Git)
|
find_package(Git)
|
||||||
if(Git_FOUND)
|
if(Git_FOUND)
|
||||||
execute_process(COMMAND ${GIT_EXECUTABLE} --git-dir=${CMAKE_CURRENT_SOURCE_DIR}/.git describe --always --abbrev=40
|
execute_process(COMMAND ${GIT_EXECUTABLE} --git-dir=${CMAKE_CURRENT_SOURCE_DIR}/.git rev-parse HEAD
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE gch)
|
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE gch)
|
||||||
if(gch)
|
if(gch)
|
||||||
set(GIT_COMMIT_HASH "${gch}")
|
set(GIT_COMMIT_HASH "${gch}")
|
||||||
message(STATUS gch: ${GIT_COMMIT_HASH})
|
message(STATUS gch: ${GIT_COMMIT_HASH})
|
||||||
add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}")
|
add_definitions(-DGIT_COMMIT_HASH="${GIT_COMMIT_HASH}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
execute_process(COMMAND ${GIT_EXECUTABLE} --git-dir=${CMAKE_CURRENT_SOURCE_DIR}/.git rev-parse --abbrev-ref HEAD
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE gb)
|
||||||
|
if(gb)
|
||||||
|
set(GIT_BRANCH "${gb}")
|
||||||
|
message(STATUS gb: ${GIT_BRANCH})
|
||||||
|
add_definitions(-DGIT_BRANCH="${GIT_BRANCH}")
|
||||||
|
endif()
|
||||||
endif() #git
|
endif() #git
|
||||||
|
|
||||||
if(thread_safety_analysis)
|
if(thread_safety_analysis)
|
||||||
@@ -38,7 +58,6 @@ include (CheckCXXCompilerFlag)
|
|||||||
include (FetchContent)
|
include (FetchContent)
|
||||||
include (ExternalProject)
|
include (ExternalProject)
|
||||||
include (CMakeFuncs) # must come *after* ExternalProject b/c it overrides one function in EP
|
include (CMakeFuncs) # must come *after* ExternalProject b/c it overrides one function in EP
|
||||||
include (ProcessorCount)
|
|
||||||
if (target)
|
if (target)
|
||||||
message (FATAL_ERROR "The target option has been removed - use native cmake options to control build")
|
message (FATAL_ERROR "The target option has been removed - use native cmake options to control build")
|
||||||
endif ()
|
endif ()
|
||||||
@@ -46,7 +65,6 @@ endif ()
|
|||||||
include(RippledSanity)
|
include(RippledSanity)
|
||||||
include(RippledVersion)
|
include(RippledVersion)
|
||||||
include(RippledSettings)
|
include(RippledSettings)
|
||||||
include(RippledRelease)
|
|
||||||
# this check has to remain in the top-level cmake
|
# this check has to remain in the top-level cmake
|
||||||
# because of the early return statement
|
# because of the early return statement
|
||||||
if (packages_only)
|
if (packages_only)
|
||||||
@@ -72,9 +90,16 @@ set_target_properties(OpenSSL::SSL PROPERTIES
|
|||||||
INTERFACE_COMPILE_DEFINITIONS OPENSSL_NO_SSL2
|
INTERFACE_COMPILE_DEFINITIONS OPENSSL_NO_SSL2
|
||||||
)
|
)
|
||||||
set(SECP256K1_INSTALL TRUE)
|
set(SECP256K1_INSTALL TRUE)
|
||||||
add_subdirectory(src/secp256k1)
|
set(SECP256K1_BUILD_BENCHMARK FALSE)
|
||||||
|
set(SECP256K1_BUILD_TESTS FALSE)
|
||||||
|
set(SECP256K1_BUILD_EXHAUSTIVE_TESTS FALSE)
|
||||||
|
set(SECP256K1_BUILD_CTIME_TESTS FALSE)
|
||||||
|
set(SECP256K1_BUILD_EXAMPLES FALSE)
|
||||||
|
add_subdirectory(external/secp256k1)
|
||||||
add_library(secp256k1::secp256k1 ALIAS secp256k1)
|
add_library(secp256k1::secp256k1 ALIAS secp256k1)
|
||||||
add_subdirectory(src/ed25519-donna)
|
add_subdirectory(external/ed25519-donna)
|
||||||
|
add_subdirectory(external/antithesis-sdk)
|
||||||
|
find_package(gRPC REQUIRED)
|
||||||
find_package(lz4 REQUIRED)
|
find_package(lz4 REQUIRED)
|
||||||
# Target names with :: are not allowed in a generator expression.
|
# Target names with :: are not allowed in a generator expression.
|
||||||
# We need to pull the include directories and imported location properties
|
# We need to pull the include directories and imported location properties
|
||||||
@@ -82,7 +107,6 @@ find_package(lz4 REQUIRED)
|
|||||||
find_package(LibArchive REQUIRED)
|
find_package(LibArchive REQUIRED)
|
||||||
find_package(SOCI REQUIRED)
|
find_package(SOCI REQUIRED)
|
||||||
find_package(SQLite3 REQUIRED)
|
find_package(SQLite3 REQUIRED)
|
||||||
find_package(Snappy REQUIRED)
|
|
||||||
|
|
||||||
option(rocksdb "Enable RocksDB" ON)
|
option(rocksdb "Enable RocksDB" ON)
|
||||||
if(rocksdb)
|
if(rocksdb)
|
||||||
@@ -95,10 +119,10 @@ endif()
|
|||||||
|
|
||||||
find_package(nudb REQUIRED)
|
find_package(nudb REQUIRED)
|
||||||
find_package(date REQUIRED)
|
find_package(date REQUIRED)
|
||||||
|
find_package(xxHash REQUIRED)
|
||||||
|
|
||||||
target_link_libraries(ripple_libs INTERFACE
|
target_link_libraries(ripple_libs INTERFACE
|
||||||
ed25519::ed25519
|
ed25519::ed25519
|
||||||
LibArchive::LibArchive
|
|
||||||
lz4::lz4
|
lz4::lz4
|
||||||
OpenSSL::Crypto
|
OpenSSL::Crypto
|
||||||
OpenSSL::SSL
|
OpenSSL::SSL
|
||||||
@@ -117,21 +141,16 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
target_link_libraries(ripple_libs INTERFACE ${nudb})
|
target_link_libraries(ripple_libs INTERFACE ${nudb})
|
||||||
|
|
||||||
if(reporting)
|
if(coverage)
|
||||||
find_package(cassandra-cpp-driver REQUIRED)
|
include(RippledCov)
|
||||||
find_package(PostgreSQL REQUIRED)
|
|
||||||
target_link_libraries(ripple_libs INTERFACE
|
|
||||||
cassandra-cpp-driver::cassandra-cpp-driver
|
|
||||||
PostgreSQL::PostgreSQL
|
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
###
|
set(PROJECT_EXPORT_SET RippleExports)
|
||||||
|
|
||||||
include(RippledCore)
|
include(RippledCore)
|
||||||
include(deps/Protobuf)
|
|
||||||
include(deps/gRPC)
|
|
||||||
include(RippledInstall)
|
include(RippledInstall)
|
||||||
include(RippledCov)
|
|
||||||
include(RippledMultiConfig)
|
|
||||||
include(RippledValidatorKeys)
|
include(RippledValidatorKeys)
|
||||||
|
|
||||||
|
if(tests)
|
||||||
|
include(CTest)
|
||||||
|
add_subdirectory(src/tests/libxrpl)
|
||||||
|
endif()
|
||||||
|
|||||||
883
CONTRIBUTING.md
883
CONTRIBUTING.md
@@ -5,15 +5,12 @@ XRPL.
|
|||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
We assume you are familiar with the general practice of [making
|
We assume you are familiar with the general practice of [making
|
||||||
contributions on GitHub][1]. This file includes only special
|
contributions on GitHub][contrib]. This file includes only special
|
||||||
instructions specific to this project.
|
instructions specific to this project.
|
||||||
|
|
||||||
|
|
||||||
## Before you start
|
## Before you start
|
||||||
|
|
||||||
In general, contributions should be developed in your personal
|
|
||||||
[fork](https://github.com/XRPLF/rippled/fork).
|
|
||||||
|
|
||||||
The following branches exist in the main project repository:
|
The following branches exist in the main project repository:
|
||||||
|
|
||||||
- `develop`: The latest set of unreleased features, and the most common
|
- `develop`: The latest set of unreleased features, and the most common
|
||||||
@@ -26,9 +23,20 @@ The tip of each branch must be signed. In order for GitHub to sign a
|
|||||||
squashed commit that it builds from your pull request, GitHub must know
|
squashed commit that it builds from your pull request, GitHub must know
|
||||||
your verifying key. Please set up [signature verification][signing].
|
your verifying key. Please set up [signature verification][signing].
|
||||||
|
|
||||||
[rippled]: https://github.com/XRPLF/rippled
|
In general, external contributions should be developed in your personal
|
||||||
[signing]:
|
[fork][forking]. Contributions from developers with write permissions
|
||||||
https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification
|
should be done in [the main repository][rippled] in a branch with
|
||||||
|
a permitted prefix. Permitted prefixes are:
|
||||||
|
* XLS-[a-zA-Z0-9]+/.+
|
||||||
|
* e.g. XLS-0033d/mpt-clarify-STEitherAmount
|
||||||
|
* [GitHub username]/.+
|
||||||
|
* e.g. JoelKatz/fix-rpc-webhook-queue
|
||||||
|
* [Organization name]/.+
|
||||||
|
* e.g. ripple/antithesis
|
||||||
|
|
||||||
|
Regardless of where the branch is created, please open a *draft* pull
|
||||||
|
request as soon as possible after pushing the branch to Github, to
|
||||||
|
increase visibility, and ease feedback during the development process.
|
||||||
|
|
||||||
|
|
||||||
## Major contributions
|
## Major contributions
|
||||||
@@ -49,6 +57,7 @@ author delegates that responsibility to others.
|
|||||||
|
|
||||||
|
|
||||||
## Before making a pull request
|
## Before making a pull request
|
||||||
|
(Or marking a draft pull request as ready.)
|
||||||
|
|
||||||
Changes that alter transaction processing must be guarded by an
|
Changes that alter transaction processing must be guarded by an
|
||||||
[Amendment](https://xrpl.org/amendments.html).
|
[Amendment](https://xrpl.org/amendments.html).
|
||||||
@@ -57,43 +66,141 @@ Amendment.
|
|||||||
|
|
||||||
Ensure that your code compiles according to the build instructions in
|
Ensure that your code compiles according to the build instructions in
|
||||||
[`BUILD.md`](./BUILD.md).
|
[`BUILD.md`](./BUILD.md).
|
||||||
If you create new source files, they must go under `src/ripple`.
|
|
||||||
You will need to add them to one of the
|
|
||||||
[source lists](./Builds/CMake/RippledCore.cmake) in CMake.
|
|
||||||
|
|
||||||
Please write tests for your code.
|
Please write tests for your code.
|
||||||
If you create new test source files, they must go under `src/test`.
|
|
||||||
You will need to add them to one of the
|
|
||||||
[source lists](./Builds/CMake/RippledCore.cmake) in CMake.
|
|
||||||
If your test can be run offline, in under 60 seconds, then it can be an
|
If your test can be run offline, in under 60 seconds, then it can be an
|
||||||
automatic test run by `rippled --unittest`.
|
automatic test run by `rippled --unittest`.
|
||||||
Otherwise, it must be a manual test.
|
Otherwise, it must be a manual test.
|
||||||
|
|
||||||
|
If you create new source files, they must be organized as follows:
|
||||||
|
* If the files are in any of the `libxrpl` modules, the headers (`.h`) must go
|
||||||
|
under `include/xrpl`, and source (`.cpp`) files must go under
|
||||||
|
`src/libxrpl`.
|
||||||
|
* All other non-test files must go under `src/xrpld`.
|
||||||
|
* All test source files must go under `src/test`.
|
||||||
|
|
||||||
The source must be formatted according to the style guide below.
|
The source must be formatted according to the style guide below.
|
||||||
|
|
||||||
Header includes must be [levelized](./Builds/levelization).
|
Header includes must be [levelized](./Builds/levelization).
|
||||||
|
|
||||||
|
Changes should be usually squashed down into a single commit.
|
||||||
|
Some larger or more complicated change sets make more sense,
|
||||||
|
and are easier to review if organized into multiple logical commits.
|
||||||
|
Either way, all commits should fit the following criteria:
|
||||||
|
* Changes should be presented in a single commit or a logical
|
||||||
|
sequence of commits.
|
||||||
|
Specifically, chronological commits that simply
|
||||||
|
reflect the history of how the author implemented
|
||||||
|
the change, "warts and all", are not useful to
|
||||||
|
reviewers.
|
||||||
|
* Every commit should have a [good message](#good-commit-messages).
|
||||||
|
to explain a specific aspects of the change.
|
||||||
|
* Every commit should be signed.
|
||||||
|
* Every commit should be well-formed (builds successfully,
|
||||||
|
unit tests passing), as this helps to resolve merge
|
||||||
|
conflicts, and makes it easier to use `git bisect`
|
||||||
|
to find bugs.
|
||||||
|
|
||||||
|
### Good commit messages
|
||||||
|
|
||||||
|
Refer to
|
||||||
|
["How to Write a Git Commit Message"](https://cbea.ms/git-commit/)
|
||||||
|
for general rules on writing a good commit message.
|
||||||
|
|
||||||
|
tl;dr
|
||||||
|
> 1. Separate subject from body with a blank line.
|
||||||
|
> 2. Limit the subject line to 50 characters.
|
||||||
|
> * [...]shoot for 50 characters, but consider 72 the hard limit.
|
||||||
|
> 3. Capitalize the subject line.
|
||||||
|
> 4. Do not end the subject line with a period.
|
||||||
|
> 5. Use the imperative mood in the subject line.
|
||||||
|
> * A properly formed Git commit subject line should always be able
|
||||||
|
> to complete the following sentence: "If applied, this commit will
|
||||||
|
> _your subject line here_".
|
||||||
|
> 6. Wrap the body at 72 characters.
|
||||||
|
> 7. Use the body to explain what and why vs. how.
|
||||||
|
|
||||||
|
In addition to those guidelines, please add one of the following
|
||||||
|
prefixes to the subject line if appropriate.
|
||||||
|
* `fix:` - The primary purpose is to fix an existing bug.
|
||||||
|
* `perf:` - The primary purpose is performance improvements.
|
||||||
|
* `refactor:` - The changes refactor code without affecting
|
||||||
|
functionality.
|
||||||
|
* `test:` - The changes _only_ affect unit tests.
|
||||||
|
* `docs:` - The changes _only_ affect documentation. This can
|
||||||
|
include code comments in addition to `.md` files like this one.
|
||||||
|
* `build:` - The changes _only_ affect the build process,
|
||||||
|
including CMake and/or Conan settings.
|
||||||
|
* `chore:` - Other tasks that don't affect the binary, but don't fit
|
||||||
|
any of the other cases. e.g. formatting, git settings, updating
|
||||||
|
Github Actions jobs.
|
||||||
|
|
||||||
|
Whenever possible, when updating commits after the PR is open, please
|
||||||
|
add the PR number to the end of the subject line. e.g. `test: Add
|
||||||
|
unit tests for Feature X (#1234)`.
|
||||||
|
|
||||||
## Pull requests
|
## Pull requests
|
||||||
|
|
||||||
In general, pull requests use `develop` as the base branch.
|
In general, pull requests use `develop` as the base branch.
|
||||||
|
The exceptions are
|
||||||
|
* Fixes and improvements to a release candidate use `release` as the
|
||||||
|
base.
|
||||||
|
* Hotfixes use `master` as the base.
|
||||||
|
|
||||||
(Hotfixes are an exception.)
|
If your changes are not quite ready, but you want to make it easily available
|
||||||
|
for preliminary examination or review, you can create a "Draft" pull request.
|
||||||
|
While a pull request is marked as a "Draft", you can rebase or reorganize the
|
||||||
|
commits in the pull request as desired.
|
||||||
|
|
||||||
Changes to pull requests must be added as new commits.
|
Github pull requests are created as "Ready" by default, or you can mark
|
||||||
Once code reviewers have started looking at your code, please avoid
|
a "Draft" pull request as "Ready".
|
||||||
force-pushing a branch in a pull request.
|
Once a pull request is marked as "Ready",
|
||||||
|
any changes must be added as new commits. Do not
|
||||||
|
force-push to a branch in a pull request under review.
|
||||||
|
(This includes rebasing your branch onto the updated base branch.
|
||||||
|
Use a merge operation, instead or hit the "Update branch" button
|
||||||
|
at the bottom of the Github PR page.)
|
||||||
This preserves the ability for reviewers to filter changes since their last
|
This preserves the ability for reviewers to filter changes since their last
|
||||||
review.
|
review.
|
||||||
|
|
||||||
A pull request must obtain **approvals from at least two reviewers** before it
|
A pull request must obtain **approvals from at least two reviewers**
|
||||||
can be considered for merge by a Maintainer.
|
before it can be considered for merge by a Maintainer.
|
||||||
Maintainers retain discretion to require more approvals if they feel the
|
Maintainers retain discretion to require more approvals if they feel the
|
||||||
credibility of the existing approvals is insufficient.
|
credibility of the existing approvals is insufficient.
|
||||||
|
|
||||||
Pull requests must be merged by [squash-and-merge][2]
|
Pull requests must be merged by [squash-and-merge][squash]
|
||||||
to preserve a linear history for the `develop` branch.
|
to preserve a linear history for the `develop` branch.
|
||||||
|
|
||||||
|
### "Ready to merge"
|
||||||
|
|
||||||
|
A pull request should only have the "Ready to merge" label added when it
|
||||||
|
meets a few criteria:
|
||||||
|
|
||||||
|
1. It must have two approving reviews [as described
|
||||||
|
above](#pull-requests). (Exception: PRs that are deemed "trivial"
|
||||||
|
only need one approval.)
|
||||||
|
2. All CI checks must be complete and passed. (One-off failures may
|
||||||
|
be acceptable if they are related to a known issue.)
|
||||||
|
3. The PR must have a [good commit message](#good-commit-messages).
|
||||||
|
* If the PR started with a good commit message, and it doesn't
|
||||||
|
need to be updated, the author can indicate that in a comment.
|
||||||
|
* Any contributor, preferably the author, can leave a comment
|
||||||
|
suggesting a commit message.
|
||||||
|
* If the author squashes and rebases the code in preparation for
|
||||||
|
merge, they should also ensure the commit message(s) are updated
|
||||||
|
as well.
|
||||||
|
4. The PR branch must be up to date with the base branch (usually
|
||||||
|
`develop`). This is usually accomplished by merging the base branch
|
||||||
|
into the feature branch, but if the other criteria are met, the
|
||||||
|
changes can be squashed and rebased on top of the base branch.
|
||||||
|
5. Finally, and most importantly, the author of the PR must
|
||||||
|
positively indicate that the PR is ready to merge. That can be
|
||||||
|
accomplished by adding the "Ready to merge" label if their role
|
||||||
|
allows, or by leaving a comment to the effect that the PR is ready to
|
||||||
|
merge.
|
||||||
|
|
||||||
|
Once the "Ready to merge" label is added, a maintainer may merge the PR
|
||||||
|
at any time, so don't use it lightly.
|
||||||
|
|
||||||
# Style guide
|
# Style guide
|
||||||
|
|
||||||
@@ -104,7 +211,7 @@ coherent rather than a set of _thou shalt not_ commandments.
|
|||||||
|
|
||||||
## Formatting
|
## Formatting
|
||||||
|
|
||||||
All code must conform to `clang-format` version 10,
|
All code must conform to `clang-format` version 18,
|
||||||
according to the settings in [`.clang-format`](./.clang-format),
|
according to the settings in [`.clang-format`](./.clang-format),
|
||||||
unless the result would be unreasonably difficult to read or maintain.
|
unless the result would be unreasonably difficult to read or maintain.
|
||||||
To demarcate lines that should be left as-is, surround them with comments like
|
To demarcate lines that should be left as-is, surround them with comments like
|
||||||
@@ -119,12 +226,103 @@ this:
|
|||||||
You can format individual files in place by running `clang-format -i <file>...`
|
You can format individual files in place by running `clang-format -i <file>...`
|
||||||
from any directory within this project.
|
from any directory within this project.
|
||||||
|
|
||||||
|
There is a Continuous Integration job that runs clang-format on pull requests. If the code doesn't comply, a patch file that corrects auto-fixable formatting issues is generated.
|
||||||
|
|
||||||
|
To download the patch file:
|
||||||
|
|
||||||
|
1. Next to `clang-format / check (pull_request) Failing after #s` -> click **Details** to open the details page.
|
||||||
|
2. Left menu -> click **Summary**
|
||||||
|
3. Scroll down to near the bottom-right under `Artifacts` -> click **clang-format.patch**
|
||||||
|
4. Download the zip file and extract it to your local git repository. Run `git apply [patch-file-name]`.
|
||||||
|
5. Commit and push.
|
||||||
|
|
||||||
You can install a pre-commit hook to automatically run `clang-format` before every commit:
|
You can install a pre-commit hook to automatically run `clang-format` before every commit:
|
||||||
```
|
```
|
||||||
pip3 install pre-commit
|
pip3 install pre-commit
|
||||||
pre-commit install
|
pre-commit install
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Contracts and instrumentation
|
||||||
|
|
||||||
|
We are using [Antithesis](https://antithesis.com/) for continuous fuzzing,
|
||||||
|
and keep a copy of [Antithesis C++ SDK](https://github.com/antithesishq/antithesis-sdk-cpp/)
|
||||||
|
in `external/antithesis-sdk`. One of the aims of fuzzing is to identify bugs
|
||||||
|
by finding external conditions which cause contracts violations inside `rippled`.
|
||||||
|
The contracts are expressed as `XRPL_ASSERT` or `UNREACHABLE` (defined in
|
||||||
|
`include/xrpl/beast/utility/instrumentation.h`), which are effectively (outside
|
||||||
|
of Antithesis) wrappers for `assert(...)` with added name. The purpose of name
|
||||||
|
is to provide contracts with stable identity which does not rely on line numbers.
|
||||||
|
|
||||||
|
When `rippled` is built with the Antithesis instrumentation enabled
|
||||||
|
(using `voidstar` CMake option) and ran on the Antithesis platform, the
|
||||||
|
contracts become
|
||||||
|
[test properties](https://antithesis.com/docs/using_antithesis/properties.html);
|
||||||
|
otherwise they are just like a regular `assert`.
|
||||||
|
To learn more about Antithesis, see
|
||||||
|
[How Antithesis Works](https://antithesis.com/docs/introduction/how_antithesis_works.html)
|
||||||
|
and [C++ SDK](https://antithesis.com/docs/using_antithesis/sdk/cpp/overview.html#)
|
||||||
|
|
||||||
|
We continue to use the old style `assert` or `assert(false)` in certain
|
||||||
|
locations, where the reporting of contract violations on the Antithesis
|
||||||
|
platform is either not possible or not useful.
|
||||||
|
|
||||||
|
For this reason:
|
||||||
|
* The locations where `assert` or `assert(false)` contracts should continue to be used:
|
||||||
|
* `constexpr` functions
|
||||||
|
* unit tests i.e. files under `src/test`
|
||||||
|
* unit tests-related modules (files under `beast/test` and `beast/unit_test`)
|
||||||
|
* Outside of the listed locations, do not use `assert`; use `XRPL_ASSERT` instead,
|
||||||
|
giving it unique name, with the short description of the contract.
|
||||||
|
* Outside of the listed locations, do not use `assert(false)`; use
|
||||||
|
`UNREACHABLE` instead, giving it unique name, with the description of the
|
||||||
|
condition being violated
|
||||||
|
* The contract name should start with a full name (including scope) of the
|
||||||
|
function, optionally a named lambda, followed by a colon ` : ` and a brief
|
||||||
|
(typically at most five words) description. `UNREACHABLE` contracts
|
||||||
|
can use slightly longer descriptions. If there are multiple overloads of the
|
||||||
|
function, use common sense to balance both brevity and unambiguity of the
|
||||||
|
function name. NOTE: the purpose of name is to provide stable means of
|
||||||
|
unique identification of every contract; for this reason try to avoid elements
|
||||||
|
which can change in some obvious refactors or when reinforcing the condition.
|
||||||
|
* Contract description typically (except for `UNREACHABLE`) should describe the
|
||||||
|
_expected_ condition, as in "I assert that _expected_ is true".
|
||||||
|
* Contract description for `UNREACHABLE` should describe the _unexpected_
|
||||||
|
situation which caused the line to have been reached.
|
||||||
|
* Example good name for an
|
||||||
|
`UNREACHABLE` macro `"Json::operator==(Value, Value) : invalid type"`; example
|
||||||
|
good name for an `XRPL_ASSERT` macro `"Json::Value::asCString : valid type"`.
|
||||||
|
* Example **bad** name
|
||||||
|
`"RFC1751::insert(char* s, int x, int start, int length) : length is greater than or equal zero"`
|
||||||
|
(missing namespace, unnecessary full function signature, description too verbose).
|
||||||
|
Good name: `"ripple::RFC1751::insert : minimum length"`.
|
||||||
|
* In **few** well-justified cases a non-standard name can be used, in which case a
|
||||||
|
comment should be placed to explain the rationale (example in `contract.cpp`)
|
||||||
|
* Do **not** rename a contract without a good reason (e.g. the name no longer
|
||||||
|
reflects the location or the condition being checked)
|
||||||
|
* Do not use `std::unreachable`
|
||||||
|
* Do not put contracts where they can be violated by an external condition
|
||||||
|
(e.g. timing, data payload before mandatory validation etc.) as this creates
|
||||||
|
bogus bug reports (and causes crashes of Debug builds)
|
||||||
|
|
||||||
|
## Unit Tests
|
||||||
|
To execute all unit tests:
|
||||||
|
|
||||||
|
```rippled --unittest --unittest-jobs=<number of cores>```
|
||||||
|
|
||||||
|
(Note: Using multiple cores on a Mac M1 can cause spurious test failures. The
|
||||||
|
cause is still under investigation. If you observe this problem, try specifying fewer jobs.)
|
||||||
|
|
||||||
|
To run a specific set of test suites:
|
||||||
|
|
||||||
|
```
|
||||||
|
rippled --unittest TestSuiteName
|
||||||
|
```
|
||||||
|
Note: In this example, all tests with prefix `TestSuiteName` will be run, so if
|
||||||
|
`TestSuiteName1` and `TestSuiteName2` both exist, then both tests will run.
|
||||||
|
Alternatively, if the unit test name finds an exact match, it will stop
|
||||||
|
doing partial matches, i.e. if a unit test with a title of `TestSuiteName`
|
||||||
|
exists, then no other unit test will be executed, apart from `TestSuiteName`.
|
||||||
|
|
||||||
## Avoid
|
## Avoid
|
||||||
|
|
||||||
1. Proliferation of nearly identical code.
|
1. Proliferation of nearly identical code.
|
||||||
@@ -178,17 +376,646 @@ existing maintainer without a vote.
|
|||||||
|
|
||||||
## Current Maintainers
|
## Current Maintainers
|
||||||
|
|
||||||
|
Maintainers are users with maintain or admin access to the repo.
|
||||||
|
|
||||||
|
* [bthomee](https://github.com/bthomee) (Ripple)
|
||||||
|
* [intelliot](https://github.com/intelliot) (Ripple)
|
||||||
* [JoelKatz](https://github.com/JoelKatz) (Ripple)
|
* [JoelKatz](https://github.com/JoelKatz) (Ripple)
|
||||||
* [manojsdoshi](https://github.com/manojsdoshi) (Ripple)
|
|
||||||
* [n3tc4t](https://github.com/n3tc4t) (XRPL Labs)
|
|
||||||
* [Nik Bougalis](https://github.com/nbougalis)
|
|
||||||
* [nixer89](https://github.com/nixer89) (XRP Ledger Foundation)
|
* [nixer89](https://github.com/nixer89) (XRP Ledger Foundation)
|
||||||
* [RichardAH](https://github.com/RichardAH) (XRPL Labs + XRP Ledger Foundation)
|
* [RichardAH](https://github.com/RichardAH) (XRP Ledger Foundation)
|
||||||
* [seelabs](https://github.com/seelabs) (Ripple)
|
|
||||||
* [Silkjaer](https://github.com/Silkjaer) (XRP Ledger Foundation)
|
* [Silkjaer](https://github.com/Silkjaer) (XRP Ledger Foundation)
|
||||||
* [WietseWind](https://github.com/WietseWind) (XRPL Labs + XRP Ledger Foundation)
|
* [WietseWind](https://github.com/WietseWind) (XRPL Labs + XRP Ledger Foundation)
|
||||||
|
* [ximinez](https://github.com/ximinez) (Ripple)
|
||||||
|
|
||||||
|
|
||||||
|
## Current Code Reviewers
|
||||||
|
|
||||||
|
Code Reviewers are developers who have the ability to review, approve, and
|
||||||
|
in some cases merge source code changes.
|
||||||
|
|
||||||
|
* [HowardHinnant](https://github.com/HowardHinnant) (Ripple)
|
||||||
|
* [scottschurr](https://github.com/scottschurr) (Ripple)
|
||||||
|
* [seelabs](https://github.com/seelabs) (Ripple)
|
||||||
* [Ed Hennis](https://github.com/ximinez) (Ripple)
|
* [Ed Hennis](https://github.com/ximinez) (Ripple)
|
||||||
|
* [mvadari](https://github.com/mvadari) (Ripple)
|
||||||
|
* [thejohnfreeman](https://github.com/thejohnfreeman) (Ripple)
|
||||||
|
* [Bronek](https://github.com/Bronek) (Ripple)
|
||||||
|
* [manojsdoshi](https://github.com/manojsdoshi) (Ripple)
|
||||||
|
* [godexsoft](https://github.com/godexsoft) (Ripple)
|
||||||
|
* [mDuo13](https://github.com/mDuo13) (Ripple)
|
||||||
|
* [ckniffen](https://github.com/ckniffen) (Ripple)
|
||||||
|
* [arihantkothari](https://github.com/arihantkothari) (Ripple)
|
||||||
|
* [pwang200](https://github.com/pwang200) (Ripple)
|
||||||
|
* [sophiax851](https://github.com/sophiax851) (Ripple)
|
||||||
|
* [shawnxie999](https://github.com/shawnxie999) (Ripple)
|
||||||
|
* [gregtatcam](https://github.com/gregtatcam) (Ripple)
|
||||||
|
* [mtrippled](https://github.com/mtrippled) (Ripple)
|
||||||
|
* [ckeshava](https://github.com/ckeshava) (Ripple)
|
||||||
|
* [nbougalis](https://github.com/nbougalis) None
|
||||||
|
* [RichardAH](https://github.com/RichardAH) (XRPL Labs + XRP Ledger Foundation)
|
||||||
|
* [dangell7](https://github.com/dangell7) (XRPL Labs)
|
||||||
|
|
||||||
|
Developers not on this list are able and encouraged to submit feedback
|
||||||
|
on pending code changes (open pull requests).
|
||||||
|
|
||||||
|
## Instructions for maintainers
|
||||||
|
|
||||||
|
These instructions assume you have your git upstream remotes configured
|
||||||
|
to avoid accidental pushes to the main repo, and a remote group
|
||||||
|
specifying both of them. e.g.
|
||||||
|
```
|
||||||
|
$ git remote -v | grep upstream
|
||||||
|
upstream https://github.com/XRPLF/rippled.git (fetch)
|
||||||
|
upstream https://github.com/XRPLF/rippled.git (push)
|
||||||
|
upstream-push git@github.com:XRPLF/rippled.git (fetch)
|
||||||
|
upstream-push git@github.com:XRPLF/rippled.git (push)
|
||||||
|
|
||||||
|
$ git config remotes.upstreams
|
||||||
|
upstream upstream-push
|
||||||
|
```
|
||||||
|
|
||||||
|
You can use the [setup-upstreams] script to set this up.
|
||||||
|
|
||||||
|
It also assumes you have a default gpg signing key set up in git. e.g.
|
||||||
|
```
|
||||||
|
$ git config user.signingkey
|
||||||
|
968479A1AFF927E37D1A566BB5690EEEBB952194
|
||||||
|
# (This is github's key. Use your own.)
|
||||||
|
```
|
||||||
|
|
||||||
|
### When and how to merge pull requests
|
||||||
|
|
||||||
|
The maintainer should double-check that the PR has met all the
|
||||||
|
necessary criteria, and can request additional information from the
|
||||||
|
owner, or additional reviews, and can always feel free to remove the
|
||||||
|
"Ready to merge" label if appropriate. The maintainer has final say on
|
||||||
|
whether a PR gets merged, and are encouraged to communicate and issues
|
||||||
|
or concerns to other maintainers.
|
||||||
|
|
||||||
|
#### Most pull requests: "Squash and merge"
|
||||||
|
|
||||||
|
Most pull requests don't need special handling, and can simply be
|
||||||
|
merged using the "Squash and merge" button on the Github UI. Update
|
||||||
|
the suggested commit message, or modify it as needed.
|
||||||
|
|
||||||
|
#### Slightly more complicated pull requests
|
||||||
|
|
||||||
|
Some pull requests need to be pushed to `develop` as more than one
|
||||||
|
commit. A PR author may *request* to merge as separate commits. They
|
||||||
|
must *justify* why separate commits are needed, and *specify* how they
|
||||||
|
would like the commits to be merged. If you disagree with the author,
|
||||||
|
discuss it with them directly.
|
||||||
|
|
||||||
|
If the process is reasonable, follow it. The simplest option is to do a
|
||||||
|
fast forward only merge (`--ff-only`) on the command line and push to
|
||||||
|
`develop`.
|
||||||
|
|
||||||
|
Some examples of when separate commits are worthwhile are:
|
||||||
|
1. PRs where source files are reorganized in multiple steps.
|
||||||
|
2. PRs where the commits are mostly independent and *could* be separate
|
||||||
|
PRs, but are pulled together into one PR under a commit theme or
|
||||||
|
issue.
|
||||||
|
3. PRs that are complicated enough that `git bisect` would not be much
|
||||||
|
help if it determined this PR introduced a problem.
|
||||||
|
|
||||||
|
Either way, check that:
|
||||||
|
* The commits are based on the current tip of `develop`.
|
||||||
|
* The commits are clean: No merge commits (except when reverse
|
||||||
|
merging), no "[FOLD]" or "fixup!" messages.
|
||||||
|
* All commits are signed. If the commits are not signed by the author, use
|
||||||
|
`git commit --amend -S` to sign them yourself.
|
||||||
|
* At least one (but preferably all) of the commits has the PR number
|
||||||
|
in the commit message.
|
||||||
|
|
||||||
|
The "Create a merge commit" and "Rebase and merge" options should be
|
||||||
|
disabled in the Github UI, but if you ever find them available **Do not
|
||||||
|
use them!**
|
||||||
|
|
||||||
|
### Releases
|
||||||
|
|
||||||
|
All releases, including release candidates and betas, are handled
|
||||||
|
differently from typical PRs. Most importantly, never use
|
||||||
|
the Github UI to merge a release.
|
||||||
|
|
||||||
|
Rippled uses a linear workflow model that can be summarized as:
|
||||||
|
|
||||||
|
1. In between releases, developers work against the `develop` branch.
|
||||||
|
2. Periodically, a maintainer will build and tag a beta version from
|
||||||
|
`develop`, which is pushed to `release`.
|
||||||
|
* Betas are usually released every two to three weeks, though that
|
||||||
|
schedule can vary depending on progress, availability, and other
|
||||||
|
factors.
|
||||||
|
3. When the changes in `develop` are considered stable and mature enough
|
||||||
|
to be ready to release, a release candidate (RC) is built and tagged
|
||||||
|
from `develop`, and merged to `release`.
|
||||||
|
* Further development for that release (primarily fixes) then
|
||||||
|
continues against `release`, while other development continues on
|
||||||
|
`develop`. Effectively, `release` is forked from `develop`. Changes
|
||||||
|
to `release` must be reverse merged to `develop`.
|
||||||
|
4. When the candidate has passed testing and is ready for release, the
|
||||||
|
final release is merged to `master`.
|
||||||
|
5. If any issues are found post-release, a hotfix / point release may be
|
||||||
|
created, which is merged to `master`, and then reverse merged to
|
||||||
|
`develop`.
|
||||||
|
|
||||||
|
#### Betas, and the first release candidate
|
||||||
|
|
||||||
|
##### Preparing the `develop` branch
|
||||||
|
|
||||||
|
1. Optimally, the `develop` branch will be ready to go, with all
|
||||||
|
relevant PRs already merged.
|
||||||
|
2. If there are any PRs pending, merge them **BEFORE** preparing the beta.
|
||||||
|
1. If only one or two PRs need to be merged, merge those PRs [as
|
||||||
|
normal](#when-and-how-to-merge-pull-requests), updating the second
|
||||||
|
one, and waiting for CI to finish in between.
|
||||||
|
2. If there are several pending PRs, do not use the Github UI,
|
||||||
|
because the delays waiting for CI in between each merge will be
|
||||||
|
unnecessarily onerous. (Incidentally, this process can also be
|
||||||
|
used to merge if the Github UI has issues.) Merge each PR branch
|
||||||
|
directly to a `release-next` on your local machine and create a single
|
||||||
|
PR, then push your branch to `develop`.
|
||||||
|
1. Squash the changes from each PR, one commit each (unless more
|
||||||
|
are needed), being sure to sign each commit and update the
|
||||||
|
commit message to include the PR number. You may be able to use
|
||||||
|
a fast-forward merge for the first PR.
|
||||||
|
2. Push your branch.
|
||||||
|
3. Continue to [Making the release](#making-the-release) to update
|
||||||
|
the version number, etc.
|
||||||
|
|
||||||
|
The workflow may look something like:
|
||||||
|
```
|
||||||
|
git fetch --multiple upstreams user1 user2 user3 [...]
|
||||||
|
git checkout -B release-next --no-track upstream/develop
|
||||||
|
|
||||||
|
# Only do an ff-only merge if prbranch1 is either already
|
||||||
|
# squashed, or needs to be merged with separate commits,
|
||||||
|
# and has no merge commits.
|
||||||
|
# Use -S on the ff-only merge if prbranch1 isn't signed.
|
||||||
|
git merge [-S] --ff-only user1/prbranch1
|
||||||
|
|
||||||
|
git merge --squash user2/prbranch2
|
||||||
|
git commit -S # Use the commit message provided on the PR
|
||||||
|
|
||||||
|
git merge --squash user3/prbranch3
|
||||||
|
git commit -S # Use the commit message provided on the PR
|
||||||
|
|
||||||
|
[...]
|
||||||
|
|
||||||
|
# Make sure the commits look right
|
||||||
|
git log --show-signature "upstream/develop..HEAD"
|
||||||
|
|
||||||
|
git push --set-upstream origin
|
||||||
|
|
||||||
|
# Continue to "Making the release" to update the version number, so
|
||||||
|
# everything can be done in one PR.
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also use the [squash-branches] script.
|
||||||
|
|
||||||
|
You may also need to manually close the open PRs after the changes are
|
||||||
|
merged to `develop`. Be sure to include the commit ID.
|
||||||
|
|
||||||
|
##### Making the release
|
||||||
|
|
||||||
|
This includes, betas, and the first release candidate (RC).
|
||||||
|
|
||||||
|
1. If you didn't create one [preparing the `develop`
|
||||||
|
branch](#preparing-the-develop-branch), Ensure there is no old
|
||||||
|
`release-next` branch hanging around. Then make a `release-next`
|
||||||
|
branch that only changes the version number. e.g.
|
||||||
|
```
|
||||||
|
git fetch upstreams
|
||||||
|
|
||||||
|
git checkout --no-track -B release-next upstream/develop
|
||||||
|
|
||||||
|
v="A.B.C-bD"
|
||||||
|
build=$( find -name BuildInfo.cpp )
|
||||||
|
sed 's/\(^.*versionString =\).*$/\1 "'${v}'"/' ${build} > version.cpp && mv -vi version.cpp ${build}
|
||||||
|
|
||||||
|
git diff
|
||||||
|
|
||||||
|
git add ${build}
|
||||||
|
|
||||||
|
git commit -S -m "Set version to ${v}"
|
||||||
|
|
||||||
|
# You could use your "origin" repo, but some CI tests work better on upstream.
|
||||||
|
git push upstream-push
|
||||||
|
git fetch upstreams
|
||||||
|
git branch --set-upstream-to=upstream/release-next
|
||||||
|
```
|
||||||
|
You can also use the [update-version] script.
|
||||||
|
2. Create a Pull Request for `release-next` with **`develop`** as
|
||||||
|
the base branch.
|
||||||
|
1. Use the title "[TRIVIAL] Set version to X.X.X-bX".
|
||||||
|
2. Instead of the default description template, use the following:
|
||||||
|
```
|
||||||
|
## High Level Overview of Change
|
||||||
|
|
||||||
|
This PR only changes the version number. It will be merged as
|
||||||
|
soon as Github CI actions successfully complete.
|
||||||
|
```
|
||||||
|
3. Wait for CI to successfully complete, and get someone to approve
|
||||||
|
the PR. (It is safe to ignore known CI issues.)
|
||||||
|
4. Push the updated `develop` branch using your `release-next`
|
||||||
|
branch. **Do not use the Github UI. It's important to preserve
|
||||||
|
commit IDs.**
|
||||||
|
```
|
||||||
|
git push upstream-push release-next:develop
|
||||||
|
```
|
||||||
|
5. In the unlikely event that the push fails because someone has merged
|
||||||
|
something else in the meantime, rebase your branch onto the updated
|
||||||
|
`develop` branch, push again, and go back to step 3.
|
||||||
|
6. Ensure that your PR against `develop` is closed. Github should do it
|
||||||
|
automatically.
|
||||||
|
7. Once this is done, forward progress on `develop` can continue
|
||||||
|
(other PRs may be merged).
|
||||||
|
8. Now create a Pull Request for `release-next` with **`release`** as
|
||||||
|
the base branch. Instead of the default template, reuse and update
|
||||||
|
the message from the previous release. Include the following verbiage
|
||||||
|
somewhere in the description:
|
||||||
|
```
|
||||||
|
The base branch is `release`. [All releases (including
|
||||||
|
betas)](https://github.com/XRPLF/rippled/blob/develop/CONTRIBUTING.md#before-you-start)
|
||||||
|
go in `release`. This PR branch will be pushed directly to `release` (not
|
||||||
|
squashed or rebased, and not using the GitHub UI).
|
||||||
|
```
|
||||||
|
7. Sign-offs for the three platforms (Linux, Mac, Windows) usually occur
|
||||||
|
offline, but at least one approval will be needed on the PR.
|
||||||
|
* If issues are discovered during testing, simply abandon the
|
||||||
|
release. It's easy to start a new release, it should be easy to
|
||||||
|
abandon one. **DO NOT REUSE THE VERSION NUMBER.** e.g. If you
|
||||||
|
abandon 2.4.0-b1, the next attempt will be 2.4.0-b2.
|
||||||
|
8. Once everything is ready to go, push to `release`.
|
||||||
|
```
|
||||||
|
git fetch upstreams
|
||||||
|
|
||||||
|
# Just to be safe, do a dry run first:
|
||||||
|
git push --dry-run upstream-push release-next:release
|
||||||
|
|
||||||
|
# If everything looks right, push the branch
|
||||||
|
git push upstream-push release-next:release
|
||||||
|
|
||||||
|
# Check that all of the branches are updated
|
||||||
|
git fetch upstreams
|
||||||
|
git log -1 --oneline
|
||||||
|
# The output should look like:
|
||||||
|
# 0123456789 (HEAD -> upstream/release-next, upstream/release,
|
||||||
|
# upstream/develop) Set version to 2.4.0-b1
|
||||||
|
# Note that upstream/develop may not be on this commit, but
|
||||||
|
# upstream/release must be.
|
||||||
|
# Other branches, including some from upstream-push, may also be
|
||||||
|
# present.
|
||||||
|
```
|
||||||
|
9. Tag the release, too.
|
||||||
|
```
|
||||||
|
git tag <version number>
|
||||||
|
git push upstream-push <version number>
|
||||||
|
```
|
||||||
|
10. Delete the `release-next` branch on the repo. Use the Github UI or:
|
||||||
|
```
|
||||||
|
git push --delete upstream-push release-next
|
||||||
|
```
|
||||||
|
11. Finally [create a new release on
|
||||||
|
Github](https://github.com/XRPLF/rippled/releases).
|
||||||
|
|
||||||
|
#### Release candidates after the first
|
||||||
|
|
||||||
|
Once the first release candidate is [merged into
|
||||||
|
release](#making-the-release), then `release` and `develop` *are allowed
|
||||||
|
to diverge*.
|
||||||
|
|
||||||
|
If a bug or issue is discovered in a version that has a release
|
||||||
|
candidate being tested, any fix and new version will need to be applied
|
||||||
|
against `release`, then reverse-merged to `develop`. This helps keep git
|
||||||
|
history as linear as possible.
|
||||||
|
|
||||||
|
A `release-next` branch will be created from `release`, and any further
|
||||||
|
work for that release must be based on `release-next`. Specifically,
|
||||||
|
PRs must use `release-next` as the base, and those PRs will be merged
|
||||||
|
directly to `release-next` when approved. Changes should be restricted
|
||||||
|
to bug fixes, but other changes may be necessary from time to time.
|
||||||
|
|
||||||
|
1. Open any PRs for the pending release using `release-next` as the base,
|
||||||
|
so they can be merged directly in to it. Unlike `develop`, though,
|
||||||
|
`release-next` can be thrown away and recreated if necessary.
|
||||||
|
2. Once a new release candidate is ready, create a version commit as in
|
||||||
|
step 1 [above](#making-the-release) on `release-next`. You can use
|
||||||
|
the [update-version] script for this, too.
|
||||||
|
3. Jump to step 8 ("Now create a Pull Request for `release-next` with
|
||||||
|
**`release`** as the base") from the process
|
||||||
|
[above](#making-the-release) to merge `release-next` into `release`.
|
||||||
|
|
||||||
|
##### Follow up: reverse merge
|
||||||
|
|
||||||
|
Once the RC is merged and tagged, it needs to be reverse merged into
|
||||||
|
`develop` as soon as possible.
|
||||||
|
|
||||||
|
1. Create a branch, based on `upstream/develop`.
|
||||||
|
The branch name is not important, but could include "mergeNNNrcN".
|
||||||
|
E.g. For release A.B.C-rcD, use `mergeABCrcD`.
|
||||||
|
```
|
||||||
|
git fetch upstreams
|
||||||
|
|
||||||
|
git checkout --no-track -b mergeABCrcD upstream/develop
|
||||||
|
```
|
||||||
|
2. Merge `release` into your branch.
|
||||||
|
```
|
||||||
|
# I like the "--edit --log --verbose" parameters, but they are
|
||||||
|
# not required.
|
||||||
|
git merge upstream/release
|
||||||
|
```
|
||||||
|
3. `BuildInfo.cpp` will have a conflict with the version number.
|
||||||
|
Resolve it with the version from `develop` - the higher version.
|
||||||
|
4. Push your branch to your repo (or `upstream` if you have permission),
|
||||||
|
and open a normal PR against `develop`. The "High level overview" can
|
||||||
|
simply indicate that this is a merge of the RC. The "Context" should
|
||||||
|
summarize the changes from the RC. Include the following text
|
||||||
|
prominently:
|
||||||
|
```
|
||||||
|
This PR must be merged manually using a push. Do not use the Github UI.
|
||||||
|
```
|
||||||
|
5. Depending on the complexity of the changes, and/or merge conflicts,
|
||||||
|
the PR may need a thorough review, or just a sign-off that the
|
||||||
|
merge was done correctly.
|
||||||
|
6. If `develop` is updated before this PR is merged, do not merge
|
||||||
|
`develop` back into your branch. Instead rebase preserving merges,
|
||||||
|
or do the merge again. (See also the `rerere` git config setting.)
|
||||||
|
```
|
||||||
|
git rebase --rebase-merges upstream/develop
|
||||||
|
# OR
|
||||||
|
git reset --hard upstream/develop
|
||||||
|
git merge upstream/release
|
||||||
|
```
|
||||||
|
7. When the PR is ready, push it to `develop`.
|
||||||
|
```
|
||||||
|
git fetch upstreams
|
||||||
|
|
||||||
|
# Make sure the commits look right
|
||||||
|
git log --show-signature "upstream/develop^..HEAD"
|
||||||
|
|
||||||
|
git push upstream-push mergeABCrcD:develop
|
||||||
|
|
||||||
|
git fetch upstreams
|
||||||
|
```
|
||||||
|
Development on `develop` can proceed as normal.
|
||||||
|
|
||||||
|
|
||||||
[1]: https://docs.github.com/en/get-started/quickstart/contributing-to-projects
|
#### Final releases
|
||||||
[2]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/about-pull-request-merges#squash-and-merge-your-commits
|
|
||||||
|
A final release is any release that is not a beta or RC, such as 2.2.0.
|
||||||
|
|
||||||
|
Only code that has already been tested and vetted across all three
|
||||||
|
platforms should be included in a final release. Most of the time, that
|
||||||
|
means that the commit immediately preceding the commit setting the
|
||||||
|
version number will be an RC. Occasionally, there may be last-minute bug
|
||||||
|
fixes included as well. If so, those bug fixes must have been tested
|
||||||
|
internally as if they were RCs (at minimum, ensuring unit tests pass,
|
||||||
|
and the app starts, syncs, and stops cleanly across all three
|
||||||
|
platforms.)
|
||||||
|
|
||||||
|
*If in doubt, make an RC first.*
|
||||||
|
|
||||||
|
The process for building a final release is very similar to [the process
|
||||||
|
for building a beta](#making-the-release), except the code will be
|
||||||
|
moving from `release` to `master` instead of from `develop` to
|
||||||
|
`release`, and both branches will be pushed at the same time.
|
||||||
|
|
||||||
|
1. Ensure there is no old `master-next` branch hanging around.
|
||||||
|
Then make a `master-next` branch that only changes the version
|
||||||
|
number. As above, or using the
|
||||||
|
[update-version] script.
|
||||||
|
2. Create a Pull Request for `master-next` with **`master`** as
|
||||||
|
the base branch. Instead of the default template, reuse and update
|
||||||
|
the message from the previous final release. Include the following verbiage
|
||||||
|
somewhere in the description:
|
||||||
|
```
|
||||||
|
The base branch is `master`. This PR branch will be pushed directly to
|
||||||
|
`release` and `master` (not squashed or rebased, and not using the
|
||||||
|
GitHub UI).
|
||||||
|
```
|
||||||
|
7. Sign-offs for the three platforms (Linux, Mac, Windows) usually occur
|
||||||
|
offline, but at least one approval will be needed on the PR.
|
||||||
|
* If issues are discovered during testing, close the PR, delete
|
||||||
|
`master-next`, and move development back to `release`, [issuing
|
||||||
|
more RCs as necessary](#release-candidates-after-the-first)
|
||||||
|
8. Once everything is ready to go, push to `release` and `master`.
|
||||||
|
```
|
||||||
|
git fetch upstreams
|
||||||
|
|
||||||
|
# Just to be safe, do dry runs first:
|
||||||
|
git push --dry-run upstream-push master-next:release
|
||||||
|
git push --dry-run upstream-push master-next:master
|
||||||
|
|
||||||
|
# If everything looks right, push the branch
|
||||||
|
git push upstream-push master-next:release
|
||||||
|
git push upstream-push master-next:master
|
||||||
|
|
||||||
|
# Check that all of the branches are updated
|
||||||
|
git fetch upstreams
|
||||||
|
git log -1 --oneline
|
||||||
|
# The output should look like:
|
||||||
|
# 0123456789 (HEAD -> upstream/master-next, upstream/master,
|
||||||
|
# upstream/release) Set version to A.B.0
|
||||||
|
# Note that both upstream/release and upstream/master must be on this
|
||||||
|
# commit.
|
||||||
|
# Other branches, including some from upstream-push, may also be
|
||||||
|
# present.
|
||||||
|
```
|
||||||
|
9. Tag the release, too.
|
||||||
|
```
|
||||||
|
git tag <version number>
|
||||||
|
git push upstream-push <version number>
|
||||||
|
```
|
||||||
|
10. Delete the `master-next` branch on the repo. Use the Github UI or:
|
||||||
|
```
|
||||||
|
git push --delete upstream-push master-next
|
||||||
|
```
|
||||||
|
11. [Create a new release on
|
||||||
|
Github](https://github.com/XRPLF/rippled/releases). Be sure that
|
||||||
|
"Set as the latest release" is checked.
|
||||||
|
12. Finally [reverse merge the release into `develop`](#follow-up-reverse-merge).
|
||||||
|
|
||||||
|
#### Special cases: point releases, hotfixes, etc.
|
||||||
|
|
||||||
|
On occassion, a bug or issue is discovered in a version that already
|
||||||
|
had a final release. Most of the time, development will have started
|
||||||
|
on the next version, and will usually have changes in `develop`
|
||||||
|
and often in `release`.
|
||||||
|
|
||||||
|
Because git history is kept as linear as possible, any fix and new
|
||||||
|
version will need to be applied against `master`.
|
||||||
|
|
||||||
|
The process for building a hotfix release is very similar to [the
|
||||||
|
process for building release candidates after the
|
||||||
|
first](#release-candidates-after-the-first) and [for building a final
|
||||||
|
release](#final-releases), except the changes will be done against
|
||||||
|
`master` instead of `release`.
|
||||||
|
|
||||||
|
If there is only a single issue for the hotfix, the work can be done in
|
||||||
|
any branch. When it's ready to merge, jump to step 3 using your branch
|
||||||
|
instead of `master-next`.
|
||||||
|
|
||||||
|
1. Create a `master-next` branch from `master`.
|
||||||
|
```
|
||||||
|
git checkout --no-track -b master-next upstream/master
|
||||||
|
git push upstream-push
|
||||||
|
git fetch upstreams
|
||||||
|
```
|
||||||
|
2. Open any PRs for the pending hotfix using `master-next` as the base,
|
||||||
|
so they can be merged directly in to it. Unlike `develop`, though,
|
||||||
|
`master-next` can be thrown away and recreated if necessary.
|
||||||
|
3. Once the hotfix is ready, create a version commit using the same
|
||||||
|
steps as above, or use the
|
||||||
|
[update-version] script.
|
||||||
|
4. Create a Pull Request for `master-next` with **`master`** as
|
||||||
|
the base branch. Instead of the default template, reuse and update
|
||||||
|
the message from the previous final release. Include the following verbiage
|
||||||
|
somewhere in the description:
|
||||||
|
```
|
||||||
|
The base branch is `master`. This PR branch will be pushed directly to
|
||||||
|
`master` (not squashed or rebased, and not using the GitHub UI).
|
||||||
|
```
|
||||||
|
7. Sign-offs for the three platforms (Linux, Mac, Windows) usually occur
|
||||||
|
offline, but at least one approval will be needed on the PR.
|
||||||
|
* If issues are discovered during testing, update `master-next` as
|
||||||
|
needed, but ensure that the changes are properly squashed, and the
|
||||||
|
version setting commit remains last
|
||||||
|
8. Once everything is ready to go, push to `master` **only**.
|
||||||
|
```
|
||||||
|
git fetch upstreams
|
||||||
|
|
||||||
|
# Just to be safe, do a dry run first:
|
||||||
|
git push --dry-run upstream-push master-next:master
|
||||||
|
|
||||||
|
# If everything looks right, push the branch
|
||||||
|
git push upstream-push master-next:master
|
||||||
|
|
||||||
|
# Check that all of the branches are updated
|
||||||
|
git fetch upstreams
|
||||||
|
git log -1 --oneline
|
||||||
|
# The output should look like:
|
||||||
|
# 0123456789 (HEAD -> upstream/master-next, upstream/master) Set version
|
||||||
|
# to 2.4.1
|
||||||
|
# Note that upstream/master must be on this commit. upstream/release and
|
||||||
|
# upstream/develop should not.
|
||||||
|
# Other branches, including some from upstream-push, may also be
|
||||||
|
# present.
|
||||||
|
```
|
||||||
|
9. Tag the release, too.
|
||||||
|
```
|
||||||
|
git tag <version number>
|
||||||
|
git push upstream-push <version number>
|
||||||
|
```
|
||||||
|
9. Delete the `master-next` branch on the repo.
|
||||||
|
```
|
||||||
|
git push --delete upstream-push master-next
|
||||||
|
```
|
||||||
|
10. [Create a new release on
|
||||||
|
Github](https://github.com/XRPLF/rippled/releases). Be sure that
|
||||||
|
"Set as the latest release" is checked.
|
||||||
|
|
||||||
|
Once the hotfix is released, it needs to be reverse merged into
|
||||||
|
`develop` as soon as possible. It may also need to be merged into
|
||||||
|
`release` if a release candidate is under development.
|
||||||
|
|
||||||
|
1. Create a branch in your own repo, based on `upstream/develop`.
|
||||||
|
The branch name is not important, but could include "mergeNNN".
|
||||||
|
E.g. For release 2.2.3, use `merge223`.
|
||||||
|
```
|
||||||
|
git fetch upstreams
|
||||||
|
|
||||||
|
git checkout --no-track -b merge223 upstream/develop
|
||||||
|
```
|
||||||
|
2. Merge master into your branch.
|
||||||
|
```
|
||||||
|
# I like the "--edit --log --verbose" parameters, but they are
|
||||||
|
# not required.
|
||||||
|
git merge upstream/master
|
||||||
|
```
|
||||||
|
3. `BuildInfo.cpp` will have a conflict with the version number.
|
||||||
|
Resolve it with the version from `develop` - the higher version.
|
||||||
|
4. Push your branch to your repo, and open a normal PR against
|
||||||
|
`develop`. The "High level overview" can simply indicate that this
|
||||||
|
is a merge of the hotfix version. The "Context" should summarize
|
||||||
|
the changes from the hotfix. Include the following text
|
||||||
|
prominently:
|
||||||
|
```
|
||||||
|
This PR must be merged manually using a --ff-only merge. Do not use the Github UI.
|
||||||
|
```
|
||||||
|
5. Depending on the complexity of the hotfix, and/or merge conflicts,
|
||||||
|
the PR may need a thorough review, or just a sign-off that the
|
||||||
|
merge was done correctly.
|
||||||
|
6. If `develop` is updated before this PR is merged, do not merge
|
||||||
|
`develop` back into your branch. Instead rebase preserving merges,
|
||||||
|
or do the merge again. (See also the `rerere` git config setting.)
|
||||||
|
```
|
||||||
|
git rebase --rebase-merges upstream/develop
|
||||||
|
# OR
|
||||||
|
git reset --hard upstream/develop
|
||||||
|
git merge upstream/master
|
||||||
|
```
|
||||||
|
7. When the PR is ready, push it to `develop`.
|
||||||
|
```
|
||||||
|
git fetch upstreams
|
||||||
|
|
||||||
|
# Make sure the commits look right
|
||||||
|
git log --show-signature "upstream/develop..HEAD"
|
||||||
|
|
||||||
|
git push upstream-push HEAD:develop
|
||||||
|
```
|
||||||
|
Development on `develop` can proceed as normal. It is recommended to
|
||||||
|
create a beta (or RC) immediately to ensure that everything worked as
|
||||||
|
expected.
|
||||||
|
|
||||||
|
##### An even rarer scenario: A hotfix on an old release
|
||||||
|
|
||||||
|
Historically, once a final release is tagged and packages are released,
|
||||||
|
versions older than the latest final release are no longer supported.
|
||||||
|
However, there is a possibility that a very high severity bug may occur
|
||||||
|
in a non-amendment blocked version that is still being run by
|
||||||
|
a significant fraction of users, which would necessitate a hotfix / point
|
||||||
|
release to that version as well as any later versions.
|
||||||
|
|
||||||
|
This scenario would follow the same basic procedure as above,
|
||||||
|
except that *none* of `develop`, `release`, or `master`
|
||||||
|
would be touched during the release process.
|
||||||
|
|
||||||
|
In this example, consider if version 2.1.1 needed to be patched.
|
||||||
|
|
||||||
|
1. Create two branches in the main (`upstream`) repo.
|
||||||
|
```
|
||||||
|
git fetch upstreams
|
||||||
|
|
||||||
|
# Create a base branch off the tag
|
||||||
|
git checkout --no-track -b master-2.1.2 2.1.1
|
||||||
|
git push upstream-push
|
||||||
|
|
||||||
|
# Create a working branch
|
||||||
|
git checkout --no-track -b master212-next master-2.1.2
|
||||||
|
git push upstream-push
|
||||||
|
|
||||||
|
git fetch upstreams
|
||||||
|
```
|
||||||
|
2. Work continues as above, except using `master-2.1.2`as
|
||||||
|
the base branch for any merging, packaging, etc.
|
||||||
|
3. After the release is tagged and packages are built, you could
|
||||||
|
potentially delete both branches, e.g. `master-2.1.2` and
|
||||||
|
`master212-next`. However, it may be useful to keep `master-2.1.2`
|
||||||
|
around indefinitely for reference.
|
||||||
|
4. Assuming that a hotfix is also released for the latest
|
||||||
|
version in parallel with this one, or if the issue is
|
||||||
|
already fixed in the latest version, do no do any
|
||||||
|
reverse merges. However, if it is not, it probably makes
|
||||||
|
sense to reverse merge `master-2.1.2` into `master`,
|
||||||
|
release a hotfix for _that_ version, then reverse merge
|
||||||
|
from `master` to `develop`. (Please don't do this unless absolutely
|
||||||
|
necessary.)
|
||||||
|
|
||||||
|
[contrib]: https://docs.github.com/en/get-started/quickstart/contributing-to-projects
|
||||||
|
[squash]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/about-pull-request-merges#squash-and-merge-your-commits
|
||||||
|
[forking]: https://github.com/XRPLF/rippled/fork
|
||||||
|
[rippled]: https://github.com/XRPLF/rippled
|
||||||
|
[signing]: https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification
|
||||||
|
[setup-upstreams]: ./bin/git/setup-upstreams.sh
|
||||||
|
[squash-branches]: ./bin/git/squash-branches.sh
|
||||||
|
[update-version]: ./bin/git/update-version.sh
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
[](https://codecov.io/gh/XRPLF/rippled)
|
||||||
|
|
||||||
# The XRP Ledger
|
# The XRP Ledger
|
||||||
|
|
||||||
The [XRP Ledger](https://xrpl.org/) is a decentralized cryptographic ledger powered by a network of peer-to-peer nodes. The XRP Ledger uses a novel Byzantine Fault Tolerant consensus algorithm to settle and record transactions in a secure distributed database without a central operator.
|
The [XRP Ledger](https://xrpl.org/) is a decentralized cryptographic ledger powered by a network of peer-to-peer nodes. The XRP Ledger uses a novel Byzantine Fault Tolerant consensus algorithm to settle and record transactions in a secure distributed database without a central operator.
|
||||||
@@ -8,7 +10,7 @@ The [XRP Ledger](https://xrpl.org/) is a decentralized cryptographic ledger powe
|
|||||||
## rippled
|
## rippled
|
||||||
The server software that powers the XRP Ledger is called `rippled` and is available in this repository under the permissive [ISC open-source license](LICENSE.md). The `rippled` server software is written primarily in C++ and runs on a variety of platforms. The `rippled` server software can run in several modes depending on its [configuration](https://xrpl.org/rippled-server-modes.html).
|
The server software that powers the XRP Ledger is called `rippled` and is available in this repository under the permissive [ISC open-source license](LICENSE.md). The `rippled` server software is written primarily in C++ and runs on a variety of platforms. The `rippled` server software can run in several modes depending on its [configuration](https://xrpl.org/rippled-server-modes.html).
|
||||||
|
|
||||||
If you are interested in running an **API Server** (including a **Full History Server**) or a **Reporting Mode** server, take a look at [Clio](https://github.com/XRPLF/clio). rippled Reporting Mode is expected to be replaced by Clio.
|
If you are interested in running an **API Server** (including a **Full History Server**), take a look at [Clio](https://github.com/XRPLF/clio). (rippled Reporting Mode has been replaced by Clio.)
|
||||||
|
|
||||||
### Build from Source
|
### Build from Source
|
||||||
|
|
||||||
|
|||||||
4164
RELEASENOTES.md
4164
RELEASENOTES.md
File diff suppressed because it is too large
Load Diff
@@ -83,7 +83,7 @@ To report a qualifying bug, please send a detailed report to:
|
|||||||
|Long Key ID | `0xCD49A0AFC57929BE` |
|
|Long Key ID | `0xCD49A0AFC57929BE` |
|
||||||
|Fingerprint | `24E6 3B02 37E0 FA9C 5E96 8974 CD49 A0AF C579 29BE` |
|
|Fingerprint | `24E6 3B02 37E0 FA9C 5E96 8974 CD49 A0AF C579 29BE` |
|
||||||
|
|
||||||
The full PGP key for this address, which is also available on several key servers (e.g. on [keys.gnupg.net](https://keys.gnupg.net)), is:
|
The full PGP key for this address, which is also available on several key servers (e.g. on [keyserver.ubuntu.com](https://keyserver.ubuntu.com)), is:
|
||||||
```
|
```
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
mQINBFUwGHYBEAC0wpGpBPkd8W1UdQjg9+cEFzeIEJRaoZoeuJD8mofwI5Ejnjdt
|
mQINBFUwGHYBEAC0wpGpBPkd8W1UdQjg9+cEFzeIEJRaoZoeuJD8mofwI5Ejnjdt
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
In this directory are two scripts, `build.sh` and `test.sh` used for building
|
|
||||||
and testing rippled.
|
|
||||||
|
|
||||||
(For now, they assume Bash and Linux. Once I get Windows containers for
|
|
||||||
testing, I'll try them there, but if Bash is not available, then they will
|
|
||||||
soon be joined by PowerShell scripts `build.ps` and `test.ps`.)
|
|
||||||
|
|
||||||
We don't want these scripts to require arcane invocations that can only be
|
|
||||||
pieced together from within a CI configuration. We want something that humans
|
|
||||||
can easily invoke, read, and understand, for when we eventually have to test
|
|
||||||
and debug them interactively. That means:
|
|
||||||
|
|
||||||
(1) They should work with no arguments.
|
|
||||||
(2) They should document their arguments.
|
|
||||||
(3) They should expand short arguments into long arguments.
|
|
||||||
|
|
||||||
While we want to provide options for common use cases, we don't need to offer
|
|
||||||
the kitchen sink. We can rightfully expect users with esoteric, complicated
|
|
||||||
needs to write their own scripts.
|
|
||||||
|
|
||||||
To make argument-handling easy for us, the implementers, we can just take all
|
|
||||||
arguments from environment variables. They have the nice advantage that every
|
|
||||||
command-line uses named arguments. For the benefit of us and our users, we
|
|
||||||
document those variables at the top of each script.
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -o xtrace
|
|
||||||
set -o errexit
|
|
||||||
|
|
||||||
# The build system. Either 'Unix Makefiles' or 'Ninja'.
|
|
||||||
GENERATOR=${GENERATOR:-Unix Makefiles}
|
|
||||||
# The compiler. Either 'gcc' or 'clang'.
|
|
||||||
COMPILER=${COMPILER:-gcc}
|
|
||||||
# The build type. Either 'Debug' or 'Release'.
|
|
||||||
BUILD_TYPE=${BUILD_TYPE:-Debug}
|
|
||||||
# Additional arguments to CMake.
|
|
||||||
# We use the `-` substitution here instead of `:-` so that callers can erase
|
|
||||||
# the default by setting `$CMAKE_ARGS` to the empty string.
|
|
||||||
CMAKE_ARGS=${CMAKE_ARGS-'-Dwerr=ON'}
|
|
||||||
|
|
||||||
# https://gitlab.kitware.com/cmake/cmake/issues/18865
|
|
||||||
CMAKE_ARGS="-DBoost_NO_BOOST_CMAKE=ON ${CMAKE_ARGS}"
|
|
||||||
|
|
||||||
if [[ ${COMPILER} == 'gcc' ]]; then
|
|
||||||
export CC='gcc'
|
|
||||||
export CXX='g++'
|
|
||||||
elif [[ ${COMPILER} == 'clang' ]]; then
|
|
||||||
export CC='clang'
|
|
||||||
export CXX='clang++'
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir build
|
|
||||||
cd build
|
|
||||||
cmake -G "${GENERATOR}" -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${CMAKE_ARGS} ..
|
|
||||||
cmake --build . -- -j $(nproc)
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -o xtrace
|
|
||||||
set -o errexit
|
|
||||||
|
|
||||||
# Set to 'true' to run the known "manual" tests in rippled.
|
|
||||||
MANUAL_TESTS=${MANUAL_TESTS:-false}
|
|
||||||
# The maximum number of concurrent tests.
|
|
||||||
CONCURRENT_TESTS=${CONCURRENT_TESTS:-$(nproc)}
|
|
||||||
# The path to rippled.
|
|
||||||
RIPPLED=${RIPPLED:-build/rippled}
|
|
||||||
# Additional arguments to rippled.
|
|
||||||
RIPPLED_ARGS=${RIPPLED_ARGS:-}
|
|
||||||
|
|
||||||
function join_by { local IFS="$1"; shift; echo "$*"; }
|
|
||||||
|
|
||||||
declare -a manual_tests=(
|
|
||||||
'beast.chrono.abstract_clock'
|
|
||||||
'beast.unit_test.print'
|
|
||||||
'ripple.NodeStore.Timing'
|
|
||||||
'ripple.app.Flow_manual'
|
|
||||||
'ripple.app.NoRippleCheckLimits'
|
|
||||||
'ripple.app.PayStrandAllPairs'
|
|
||||||
'ripple.consensus.ByzantineFailureSim'
|
|
||||||
'ripple.consensus.DistributedValidators'
|
|
||||||
'ripple.consensus.ScaleFreeSim'
|
|
||||||
'ripple.tx.CrossingLimits'
|
|
||||||
'ripple.tx.FindOversizeCross'
|
|
||||||
'ripple.tx.Offer_manual'
|
|
||||||
'ripple.tx.OversizeMeta'
|
|
||||||
'ripple.tx.PlumpBook'
|
|
||||||
)
|
|
||||||
|
|
||||||
if [[ ${MANUAL_TESTS} == 'true' ]]; then
|
|
||||||
RIPPLED_ARGS+=" --unittest=$(join_by , "${manual_tests[@]}")"
|
|
||||||
else
|
|
||||||
RIPPLED_ARGS+=" --unittest --quiet --unittest-log"
|
|
||||||
fi
|
|
||||||
RIPPLED_ARGS+=" --unittest-jobs ${CONCURRENT_TESTS}"
|
|
||||||
|
|
||||||
${RIPPLED} ${RIPPLED_ARGS}
|
|
||||||
@@ -1,274 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
function version_ge() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"; }
|
|
||||||
|
|
||||||
__dirname=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
|
||||||
echo "using CC: ${CC}"
|
|
||||||
"${CC}" --version
|
|
||||||
export CC
|
|
||||||
|
|
||||||
COMPNAME=$(basename $CC)
|
|
||||||
echo "using CXX: ${CXX:-notset}"
|
|
||||||
if [[ $CXX ]]; then
|
|
||||||
"${CXX}" --version
|
|
||||||
export CXX
|
|
||||||
fi
|
|
||||||
: ${BUILD_TYPE:=Debug}
|
|
||||||
echo "BUILD TYPE: ${BUILD_TYPE}"
|
|
||||||
|
|
||||||
: ${TARGET:=install}
|
|
||||||
echo "BUILD TARGET: ${TARGET}"
|
|
||||||
|
|
||||||
JOBS=${NUM_PROCESSORS:-2}
|
|
||||||
if [[ ${TRAVIS:-false} != "true" ]]; then
|
|
||||||
JOBS=$((JOBS+1))
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ! -z "${CMAKE_EXE:-}" ]] ; then
|
|
||||||
export PATH="$(dirname ${CMAKE_EXE}):$PATH"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -x /usr/bin/time ] ; then
|
|
||||||
: ${TIME:="Duration: %E"}
|
|
||||||
export TIME
|
|
||||||
time=/usr/bin/time
|
|
||||||
else
|
|
||||||
time=
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Building rippled"
|
|
||||||
: ${CMAKE_EXTRA_ARGS:=""}
|
|
||||||
if [[ ${NINJA_BUILD:-} == true ]]; then
|
|
||||||
CMAKE_EXTRA_ARGS+=" -G Ninja"
|
|
||||||
fi
|
|
||||||
|
|
||||||
coverage=false
|
|
||||||
if [[ "${TARGET}" == "coverage_report" ]] ; then
|
|
||||||
echo "coverage option detected."
|
|
||||||
coverage=true
|
|
||||||
fi
|
|
||||||
|
|
||||||
cmake --version
|
|
||||||
CMAKE_VER=$(cmake --version | cut -d " " -f 3 | head -1)
|
|
||||||
|
|
||||||
#
|
|
||||||
# allow explicit setting of the name of the build
|
|
||||||
# dir, otherwise default to the compiler.build_type
|
|
||||||
#
|
|
||||||
: "${BUILD_DIR:=${COMPNAME}.${BUILD_TYPE}}"
|
|
||||||
BUILDARGS="--target ${TARGET}"
|
|
||||||
BUILDTOOLARGS=""
|
|
||||||
if version_ge $CMAKE_VER "3.12.0" ; then
|
|
||||||
BUILDARGS+=" --parallel"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${NINJA_BUILD:-} == false ]]; then
|
|
||||||
if version_ge $CMAKE_VER "3.12.0" ; then
|
|
||||||
BUILDARGS+=" ${JOBS}"
|
|
||||||
else
|
|
||||||
BUILDTOOLARGS+=" -j ${JOBS}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${VERBOSE_BUILD:-} == true ]]; then
|
|
||||||
CMAKE_EXTRA_ARGS+=" -DCMAKE_VERBOSE_MAKEFILE=ON"
|
|
||||||
if version_ge $CMAKE_VER "3.14.0" ; then
|
|
||||||
BUILDARGS+=" --verbose"
|
|
||||||
else
|
|
||||||
if [[ ${NINJA_BUILD:-} == false ]]; then
|
|
||||||
BUILDTOOLARGS+=" verbose=1"
|
|
||||||
else
|
|
||||||
BUILDTOOLARGS+=" -v"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${USE_CCACHE:-} == true ]]; then
|
|
||||||
echo "using ccache with basedir [${CCACHE_BASEDIR:-}]"
|
|
||||||
CMAKE_EXTRA_ARGS+=" -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache"
|
|
||||||
fi
|
|
||||||
if [ -d "build/${BUILD_DIR}" ]; then
|
|
||||||
rm -rf "build/${BUILD_DIR}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p "build/${BUILD_DIR}"
|
|
||||||
pushd "build/${BUILD_DIR}"
|
|
||||||
|
|
||||||
# cleanup possible artifacts
|
|
||||||
rm -fv CMakeFiles/CMakeOutput.log CMakeFiles/CMakeError.log
|
|
||||||
# Clean up NIH directories which should be git repos, but aren't
|
|
||||||
for nih_path in ${NIH_CACHE_ROOT}/*/*/*/src ${NIH_CACHE_ROOT}/*/*/src
|
|
||||||
do
|
|
||||||
for dir in lz4 snappy rocksdb
|
|
||||||
do
|
|
||||||
if [ -e ${nih_path}/${dir} -a \! -e ${nih_path}/${dir}/.git ]
|
|
||||||
then
|
|
||||||
ls -la ${nih_path}/${dir}*
|
|
||||||
rm -rfv ${nih_path}/${dir}*
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
# generate
|
|
||||||
${time} cmake ../.. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${CMAKE_EXTRA_ARGS}
|
|
||||||
# Display the cmake output, to help with debugging if something fails
|
|
||||||
for file in CMakeOutput.log CMakeError.log
|
|
||||||
do
|
|
||||||
if [ -f CMakeFiles/${file} ]
|
|
||||||
then
|
|
||||||
ls -l CMakeFiles/${file}
|
|
||||||
cat CMakeFiles/${file}
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
# build
|
|
||||||
export DESTDIR=$(pwd)/_INSTALLED_
|
|
||||||
|
|
||||||
${time} eval cmake --build . ${BUILDARGS} -- ${BUILDTOOLARGS}
|
|
||||||
|
|
||||||
if [[ ${TARGET} == "docs" ]]; then
|
|
||||||
## mimic the standard test output for docs build
|
|
||||||
## to make controlling processes like jenkins happy
|
|
||||||
if [ -f docs/html/index.html ]; then
|
|
||||||
echo "1 case, 1 test total, 0 failures"
|
|
||||||
else
|
|
||||||
echo "1 case, 1 test total, 1 failures"
|
|
||||||
fi
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
popd
|
|
||||||
|
|
||||||
if [[ "${TARGET}" == "validator-keys" ]] ; then
|
|
||||||
export APP_PATH="$PWD/build/${BUILD_DIR}/validator-keys/validator-keys"
|
|
||||||
else
|
|
||||||
export APP_PATH="$PWD/build/${BUILD_DIR}/rippled"
|
|
||||||
fi
|
|
||||||
echo "using APP_PATH: ${APP_PATH}"
|
|
||||||
|
|
||||||
# See what we've actually built
|
|
||||||
ldd ${APP_PATH}
|
|
||||||
|
|
||||||
: ${APP_ARGS:=}
|
|
||||||
|
|
||||||
if [[ "${TARGET}" == "validator-keys" ]] ; then
|
|
||||||
APP_ARGS="--unittest"
|
|
||||||
else
|
|
||||||
function join_by { local IFS="$1"; shift; echo "$*"; }
|
|
||||||
|
|
||||||
# This is a list of manual tests
|
|
||||||
# in rippled that we want to run
|
|
||||||
# ORDER matters here...sorted in approximately
|
|
||||||
# descending execution time (longest running tests at top)
|
|
||||||
declare -a manual_tests=(
|
|
||||||
'ripple.ripple_data.reduce_relay_simulate'
|
|
||||||
'ripple.tx.Offer_manual'
|
|
||||||
'ripple.tx.CrossingLimits'
|
|
||||||
'ripple.tx.PlumpBook'
|
|
||||||
'ripple.app.Flow_manual'
|
|
||||||
'ripple.tx.OversizeMeta'
|
|
||||||
'ripple.consensus.DistributedValidators'
|
|
||||||
'ripple.app.NoRippleCheckLimits'
|
|
||||||
'ripple.ripple_data.compression'
|
|
||||||
'ripple.NodeStore.Timing'
|
|
||||||
'ripple.consensus.ByzantineFailureSim'
|
|
||||||
'beast.chrono.abstract_clock'
|
|
||||||
'beast.unit_test.print'
|
|
||||||
)
|
|
||||||
if [[ ${TRAVIS:-false} != "true" ]]; then
|
|
||||||
# these two tests cause travis CI to run out of memory.
|
|
||||||
# TODO: investigate possible workarounds.
|
|
||||||
manual_tests=(
|
|
||||||
'ripple.consensus.ScaleFreeSim'
|
|
||||||
'ripple.tx.FindOversizeCross'
|
|
||||||
"${manual_tests[@]}"
|
|
||||||
)
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${MANUAL_TESTS:-} == true ]]; then
|
|
||||||
APP_ARGS+=" --unittest=$(join_by , "${manual_tests[@]}")"
|
|
||||||
else
|
|
||||||
APP_ARGS+=" --unittest --quiet --unittest-log"
|
|
||||||
fi
|
|
||||||
if [[ ${coverage} == false && ${PARALLEL_TESTS:-} == true ]]; then
|
|
||||||
APP_ARGS+=" --unittest-jobs ${JOBS}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${IPV6_TESTS:-} == true ]]; then
|
|
||||||
APP_ARGS+=" --unittest-ipv6"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${coverage} == true && $CC =~ ^gcc ]]; then
|
|
||||||
# Push the results (lcov.info) to codecov
|
|
||||||
codecov -X gcov # don't even try and look for .gcov files ;)
|
|
||||||
find . -name "*.gcda" | xargs rm -f
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${SKIP_TESTS:-} == true ]]; then
|
|
||||||
echo "skipping tests."
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
ulimit -a
|
|
||||||
corepat=$(cat /proc/sys/kernel/core_pattern)
|
|
||||||
if [[ ${corepat} =~ ^[:space:]*\| ]] ; then
|
|
||||||
echo "WARNING: core pattern is piping - can't search for core files"
|
|
||||||
look_core=false
|
|
||||||
else
|
|
||||||
look_core=true
|
|
||||||
coredir=$(dirname ${corepat})
|
|
||||||
fi
|
|
||||||
if [[ ${look_core} == true ]]; then
|
|
||||||
before=$(ls -A1 ${coredir})
|
|
||||||
fi
|
|
||||||
|
|
||||||
set +e
|
|
||||||
echo "Running tests for ${APP_PATH}"
|
|
||||||
if [[ ${MANUAL_TESTS:-} == true && ${PARALLEL_TESTS:-} != true ]]; then
|
|
||||||
for t in "${manual_tests[@]}" ; do
|
|
||||||
${APP_PATH} --unittest=${t}
|
|
||||||
TEST_STAT=$?
|
|
||||||
if [[ $TEST_STAT -ne 0 ]] ; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
else
|
|
||||||
${APP_PATH} ${APP_ARGS}
|
|
||||||
TEST_STAT=$?
|
|
||||||
fi
|
|
||||||
set -e
|
|
||||||
|
|
||||||
if [[ ${look_core} == true ]]; then
|
|
||||||
after=$(ls -A1 ${coredir})
|
|
||||||
oIFS="${IFS}"
|
|
||||||
IFS=$'\n\r'
|
|
||||||
found_core=false
|
|
||||||
for l in $(diff -w --suppress-common-lines <(echo "$before") <(echo "$after")) ; do
|
|
||||||
if [[ "$l" =~ ^[[:space:]]*\>[[:space:]]*(.+)$ ]] ; then
|
|
||||||
corefile="${BASH_REMATCH[1]}"
|
|
||||||
echo "FOUND core dump file at '${coredir}/${corefile}'"
|
|
||||||
gdb_output=$(/bin/mktemp /tmp/gdb_output_XXXXXXXXXX.txt)
|
|
||||||
found_core=true
|
|
||||||
gdb \
|
|
||||||
-ex "set height 0" \
|
|
||||||
-ex "set logging file ${gdb_output}" \
|
|
||||||
-ex "set logging on" \
|
|
||||||
-ex "print 'ripple::BuildInfo::versionString'" \
|
|
||||||
-ex "thread apply all backtrace full" \
|
|
||||||
-ex "info inferiors" \
|
|
||||||
-ex quit \
|
|
||||||
"$APP_PATH" \
|
|
||||||
"${coredir}/${corefile}" &> /dev/null
|
|
||||||
|
|
||||||
echo -e "CORE INFO: \n\n $(cat ${gdb_output}) \n\n)"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="${oIFS}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${found_core} == true ]]; then
|
|
||||||
exit -1
|
|
||||||
else
|
|
||||||
exit $TEST_STAT
|
|
||||||
fi
|
|
||||||
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# run our build script in a docker container
|
|
||||||
# using travis-ci hosts
|
|
||||||
set -eux
|
|
||||||
|
|
||||||
function join_by { local IFS="$1"; shift; echo "$*"; }
|
|
||||||
|
|
||||||
set +x
|
|
||||||
echo "VERBOSE_BUILD=true" > /tmp/co.env
|
|
||||||
matchers=(
|
|
||||||
'TRAVIS.*' 'CI' 'CC' 'CXX'
|
|
||||||
'BUILD_TYPE' 'TARGET' 'MAX_TIME'
|
|
||||||
'CODECOV.+' 'CMAKE.*' '.+_TESTS'
|
|
||||||
'.+_OPTIONS' 'NINJA.*' 'NUM_.+'
|
|
||||||
'NIH_.+' 'BOOST.*' '.*CCACHE.*')
|
|
||||||
|
|
||||||
matchstring=$(join_by '|' "${matchers[@]}")
|
|
||||||
echo "MATCHSTRING IS:: $matchstring"
|
|
||||||
env | grep -E "^(${matchstring})=" >> /tmp/co.env
|
|
||||||
set -x
|
|
||||||
# need to eliminate TRAVIS_CMD...don't want to pass it to the container
|
|
||||||
cat /tmp/co.env | grep -v TRAVIS_CMD > /tmp/co.env.2
|
|
||||||
mv /tmp/co.env.2 /tmp/co.env
|
|
||||||
cat /tmp/co.env
|
|
||||||
mkdir -p -m 0777 ${TRAVIS_BUILD_DIR}/cores
|
|
||||||
echo "${TRAVIS_BUILD_DIR}/cores/%e.%p" | sudo tee /proc/sys/kernel/core_pattern
|
|
||||||
docker run \
|
|
||||||
-t --env-file /tmp/co.env \
|
|
||||||
-v ${TRAVIS_HOME}:${TRAVIS_HOME} \
|
|
||||||
-w ${TRAVIS_BUILD_DIR} \
|
|
||||||
--cap-add SYS_PTRACE \
|
|
||||||
--ulimit "core=-1" \
|
|
||||||
$DOCKER_IMAGE \
|
|
||||||
/bin/bash -c 'if [[ $CC =~ ([[:alpha:]]+)-([[:digit:].]+) ]] ; then sudo update-alternatives --set ${BASH_REMATCH[1]} /usr/bin/$CC; fi; bin/ci/ubuntu/build-and-test.sh'
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# some cached files create churn, so save them here for
|
|
||||||
# later restoration before packing the cache
|
|
||||||
set -eux
|
|
||||||
clean_cache="travis_clean_cache"
|
|
||||||
if [[ ! ( "${TRAVIS_JOB_NAME}" =~ "windows" || \
|
|
||||||
"${TRAVIS_JOB_NAME}" =~ "prereq-keep" ) ]] && \
|
|
||||||
( [[ "${TRAVIS_COMMIT_MESSAGE}" =~ "${clean_cache}" ]] || \
|
|
||||||
( [[ -v TRAVIS_PULL_REQUEST_SHA && \
|
|
||||||
"${TRAVIS_PULL_REQUEST_SHA}" != "" ]] && \
|
|
||||||
git log -1 "${TRAVIS_PULL_REQUEST_SHA}" | grep -cq "${clean_cache}" -
|
|
||||||
)
|
|
||||||
)
|
|
||||||
then
|
|
||||||
find ${TRAVIS_HOME}/_cache -maxdepth 2 -type d
|
|
||||||
rm -rf ${TRAVIS_HOME}/_cache
|
|
||||||
mkdir -p ${TRAVIS_HOME}/_cache
|
|
||||||
fi
|
|
||||||
|
|
||||||
pushd ${TRAVIS_HOME}
|
|
||||||
if [ -f cache_ignore.tar ] ; then
|
|
||||||
rm -f cache_ignore.tar
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d _cache/nih_c ] ; then
|
|
||||||
find _cache/nih_c -name "build.ninja" | tar rf cache_ignore.tar --files-from -
|
|
||||||
find _cache/nih_c -name ".ninja_deps" | tar rf cache_ignore.tar --files-from -
|
|
||||||
find _cache/nih_c -name ".ninja_log" | tar rf cache_ignore.tar --files-from -
|
|
||||||
find _cache/nih_c -name "*.log" | tar rf cache_ignore.tar --files-from -
|
|
||||||
find _cache/nih_c -name "*.tlog" | tar rf cache_ignore.tar --files-from -
|
|
||||||
# show .a files in the cache, for sanity checking
|
|
||||||
find _cache/nih_c -name "*.a" -ls
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d _cache/ccache ] ; then
|
|
||||||
find _cache/ccache -name "stats" | tar rf cache_ignore.tar --files-from -
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -f cache_ignore.tar ] ; then
|
|
||||||
tar -tf cache_ignore.tar
|
|
||||||
fi
|
|
||||||
popd
|
|
||||||
|
|
||||||
|
|
||||||
86
bin/git/setup-upstreams.sh
Executable file
86
bin/git/setup-upstreams.sh
Executable file
@@ -0,0 +1,86 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [[ $# -ne 1 || "$1" == "--help" || "$1" == "-h" ]]
|
||||||
|
then
|
||||||
|
name=$( basename $0 )
|
||||||
|
cat <<- USAGE
|
||||||
|
Usage: $name <username>
|
||||||
|
|
||||||
|
Where <username> is the Github username of the upstream repo. e.g. XRPLF
|
||||||
|
USAGE
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create upstream remotes based on origin
|
||||||
|
shift
|
||||||
|
user="$1"
|
||||||
|
# Get the origin URL. Expect it be an SSH-style URL
|
||||||
|
origin=$( git remote get-url origin )
|
||||||
|
if [[ "${origin}" == "" ]]
|
||||||
|
then
|
||||||
|
echo Invalid origin remote >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# echo "Origin: ${origin}"
|
||||||
|
# Parse the origin
|
||||||
|
ifs_orig="${IFS}"
|
||||||
|
IFS=':' read remote originpath <<< "${origin}"
|
||||||
|
# echo "Remote: ${remote}, Originpath: ${originpath}"
|
||||||
|
IFS='@' read sshuser server <<< "${remote}"
|
||||||
|
# echo "SSHUser: ${sshuser}, Server: ${server}"
|
||||||
|
IFS='/' read originuser repo <<< "${originpath}"
|
||||||
|
# echo "Originuser: ${originuser}, Repo: ${repo}"
|
||||||
|
if [[ "${sshuser}" == "" || "${server}" == "" || "${originuser}" == ""
|
||||||
|
|| "${repo}" == "" ]]
|
||||||
|
then
|
||||||
|
echo "Can't parse origin URL: ${origin}" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
upstream="https://${server}/${user}/${repo}"
|
||||||
|
upstreampush="${remote}:${user}/${repo}"
|
||||||
|
upstreamgroup="upstream upstream-push"
|
||||||
|
current=$( git remote get-url upstream 2>/dev/null )
|
||||||
|
currentpush=$( git remote get-url upstream-push 2>/dev/null )
|
||||||
|
currentgroup=$( git config remotes.upstreams )
|
||||||
|
if [[ "${current}" == "${upstream}" ]]
|
||||||
|
then
|
||||||
|
echo "Upstream already set up correctly. Skip"
|
||||||
|
elif [[ -n "${current}" && "${current}" != "${upstream}" &&
|
||||||
|
"${current}" != "${upstreampush}" ]]
|
||||||
|
then
|
||||||
|
echo "Upstream already set up as: ${current}. Skip"
|
||||||
|
else
|
||||||
|
if [[ "${current}" == "${upstreampush}" ]]
|
||||||
|
then
|
||||||
|
echo "Upstream set to dangerous push URL. Update."
|
||||||
|
_run git remote rename upstream upstream-push || \
|
||||||
|
_run git remote remove upstream
|
||||||
|
currentpush=$( git remote get-url upstream-push 2>/dev/null )
|
||||||
|
fi
|
||||||
|
_run git remote add upstream "${upstream}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${currentpush}" == "${upstreampush}" ]]
|
||||||
|
then
|
||||||
|
echo "upstream-push already set up correctly. Skip"
|
||||||
|
elif [[ -n "${currentpush}" && "${currentpush}" != "${upstreampush}" ]]
|
||||||
|
then
|
||||||
|
echo "upstream-push already set up as: ${currentpush}. Skip"
|
||||||
|
else
|
||||||
|
_run git remote add upstream-push "${upstreampush}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${currentgroup}" == "${upstreamgroup}" ]]
|
||||||
|
then
|
||||||
|
echo "Upstreams group already set up correctly. Skip"
|
||||||
|
elif [[ -n "${currentgroup}" && "${currentgroup}" != "${upstreamgroup}" ]]
|
||||||
|
then
|
||||||
|
echo "Upstreams group already set up as: ${currentgroup}. Skip"
|
||||||
|
else
|
||||||
|
_run git config --add remotes.upstreams "${upstreamgroup}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
_run git fetch --jobs=$(nproc) upstreams
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
|
||||||
69
bin/git/squash-branches.sh
Executable file
69
bin/git/squash-branches.sh
Executable file
@@ -0,0 +1,69 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [[ $# -lt 3 || "$1" == "--help" || "$1" = "-h" ]]
|
||||||
|
then
|
||||||
|
name=$( basename $0 )
|
||||||
|
cat <<- USAGE
|
||||||
|
Usage: $name workbranch base/branch user/branch [user/branch [...]]
|
||||||
|
|
||||||
|
* workbranch will be created locally from base/branch
|
||||||
|
* base/branch and user/branch may be specified as user:branch to allow
|
||||||
|
easy copying from Github PRs
|
||||||
|
* Remotes for each user must already be set up
|
||||||
|
USAGE
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
work="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
branches=( $( echo "${@}" | sed "s/:/\//" ) )
|
||||||
|
base="${branches[0]}"
|
||||||
|
unset branches[0]
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
users=()
|
||||||
|
for b in "${branches[@]}"
|
||||||
|
do
|
||||||
|
users+=( $( echo $b | cut -d/ -f1 ) )
|
||||||
|
done
|
||||||
|
|
||||||
|
users=( $( printf '%s\n' "${users[@]}" | sort -u ) )
|
||||||
|
|
||||||
|
git fetch --multiple upstreams "${users[@]}"
|
||||||
|
git checkout -B "$work" --no-track "$base"
|
||||||
|
|
||||||
|
for b in "${branches[@]}"
|
||||||
|
do
|
||||||
|
git merge --squash "${b}"
|
||||||
|
git commit -S # Use the commit message provided on the PR
|
||||||
|
done
|
||||||
|
|
||||||
|
# Make sure the commits look right
|
||||||
|
git log --show-signature "$base..HEAD"
|
||||||
|
|
||||||
|
parts=( $( echo $base | sed "s/\// /" ) )
|
||||||
|
repo="${parts[0]}"
|
||||||
|
b="${parts[1]}"
|
||||||
|
push=$repo
|
||||||
|
if [[ "$push" == "upstream" ]]
|
||||||
|
then
|
||||||
|
push="upstream-push"
|
||||||
|
fi
|
||||||
|
if [[ "$repo" == "upstream" ]]
|
||||||
|
then
|
||||||
|
repo="upstreams"
|
||||||
|
fi
|
||||||
|
cat << PUSH
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
This script will not push. Verify everything is correct, then push
|
||||||
|
to your repo, and create a PR if necessary. Once the PR is approved,
|
||||||
|
run:
|
||||||
|
|
||||||
|
git push $push HEAD:$b
|
||||||
|
git fetch $repo
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
PUSH
|
||||||
|
|
||||||
58
bin/git/update-version.sh
Executable file
58
bin/git/update-version.sh
Executable file
@@ -0,0 +1,58 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [[ $# -ne 3 || "$1" == "--help" || "$1" = "-h" ]]
|
||||||
|
then
|
||||||
|
name=$( basename $0 )
|
||||||
|
cat <<- USAGE
|
||||||
|
Usage: $name workbranch base/branch version
|
||||||
|
|
||||||
|
* workbranch will be created locally from base/branch. If it exists,
|
||||||
|
it will be reused, so make sure you don't overwrite any work.
|
||||||
|
* base/branch may be specified as user:branch to allow easy copying
|
||||||
|
from Github PRs.
|
||||||
|
USAGE
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
work="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
base=$( echo "$1" | sed "s/:/\//" )
|
||||||
|
shift
|
||||||
|
|
||||||
|
version=$1
|
||||||
|
shift
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
git fetch upstreams
|
||||||
|
|
||||||
|
git checkout -B "${work}" --no-track "${base}"
|
||||||
|
|
||||||
|
push=$( git rev-parse --abbrev-ref --symbolic-full-name '@{push}' \
|
||||||
|
2>/dev/null ) || true
|
||||||
|
if [[ "${push}" != "" ]]
|
||||||
|
then
|
||||||
|
echo "Warning: ${push} may already exist."
|
||||||
|
fi
|
||||||
|
|
||||||
|
build=$( find -name BuildInfo.cpp )
|
||||||
|
sed 's/\(^.*versionString =\).*$/\1 "'${version}'"/' ${build} > version.cpp && \
|
||||||
|
diff "${build}" version.cpp && exit 1 || \
|
||||||
|
mv -vi version.cpp ${build}
|
||||||
|
|
||||||
|
git diff
|
||||||
|
|
||||||
|
git add ${build}
|
||||||
|
|
||||||
|
git commit -S -m "Set version to ${version}"
|
||||||
|
|
||||||
|
git log --oneline --first-parent ${base}^..
|
||||||
|
|
||||||
|
cat << PUSH
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
This script will not push. Verify everything is correct, then push
|
||||||
|
to your repo, and create a PR as described in CONTRIBUTING.md.
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
PUSH
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user