mirror of
				https://github.com/XRPLF/clio.git
				synced 2025-11-04 11:55:51 +00:00 
			
		
		
		
	Compare commits
	
		
			316 Commits
		
	
	
		
			2.5.0-b2
			...
			a9e7280b96
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					a9e7280b96 | ||
| 
						 | 
					3dd72d94e1 | ||
| 
						 | 
					5e914abf29 | ||
| 
						 | 
					9603968808 | ||
| 
						 | 
					0124c06a53 | ||
| 
						 | 
					1bfdd0dd89 | ||
| 
						 | 
					f41d574204 | ||
| 
						 | 
					d0ec60381b | ||
| 
						 | 
					0b19a42a96 | ||
| 
						 | 
					030f4f1b22 | ||
| 
						 | 
					2de49b4d33 | ||
| 
						 | 
					3de2bf2910 | ||
| 
						 | 
					7538efb01e | ||
| 
						 | 
					685f611434 | ||
| 
						 | 
					2528dee6b6 | ||
| 
						 | 
					b2be4b51d1 | ||
| 
						 | 
					b4e40558c9 | ||
| 
						 | 
					b361e3a108 | ||
| 
						 | 
					a4b47da57a | ||
| 
						 | 
					2ed1a45ef1 | ||
| 
						 | 
					dabaa5bf80 | ||
| 
						 | 
					b4fb3e42b8 | ||
| 
						 | 
					aa64bb7b6b | ||
| 
						 | 
					dc5f8b9c23 | ||
| 
						 | 
					7300529484 | ||
| 
						 | 
					33802f475f | ||
| 
						 | 
					213752862c | ||
| 
						 | 
					a189eeb952 | ||
| 
						 | 
					3c1811233a | ||
| 
						 | 
					693ed2061c | ||
| 
						 | 
					1e2f4b5ca2 | ||
| 
						 | 
					1da8464d75 | ||
| 
						 | 
					d48fb168c6 | ||
| 
						 | 
					92595f95a0 | ||
| 
						 | 
					fc9de87136 | ||
| 
						 | 
					67f5ca445f | ||
| 
						 | 
					897c255b8c | ||
| 
						 | 
					aa9eea0d99 | ||
| 
						 | 
					1cfa06c9aa | ||
| 
						 | 
					2b937bf098 | ||
| 
						 | 
					c6f2197878 | ||
| 
						 | 
					48855633b5 | ||
| 
						 | 
					c26df5e1fb | ||
| 
						 | 
					9fb26d77ed | ||
| 
						 | 
					c3c8b2d796 | ||
| 
						 | 
					2f3e9498dc | ||
| 
						 | 
					d2de240389 | ||
| 
						 | 
					245a808e4b | ||
| 
						 | 
					586a2116a4 | ||
| 
						 | 
					93919ab8b7 | ||
| 
						 | 
					e92a63f4e5 | ||
| 
						 | 
					5e5dd649cf | ||
| 
						 | 
					fb1cdcbde5 | ||
| 
						 | 
					b66d13bc74 | ||
| 
						 | 
					e78ff5c442 | ||
| 
						 | 
					c499f9d679 | ||
| 
						 | 
					420b99cfa1 | ||
| 
						 | 
					3f2ada3439 | ||
| 
						 | 
					e996f2b7ab | ||
| 
						 | 
					26112d17f8 | ||
| 
						 | 
					e4abec4b98 | ||
| 
						 | 
					503e23055b | ||
| 
						 | 
					97480ce626 | ||
| 
						 | 
					bd966e636e | ||
| 
						 | 
					91b248e3b2 | ||
| 
						 | 
					140ac78e15 | ||
| 
						 | 
					f1bf423f69 | ||
| 
						 | 
					dcf369e4ec | ||
| 
						 | 
					56f4dc591c | ||
| 
						 | 
					c40cd8154f | ||
| 
						 | 
					989a0c8468 | ||
| 
						 | 
					1adbed7913 | ||
| 
						 | 
					490ec41083 | ||
| 
						 | 
					384e79cd32 | ||
| 
						 | 
					9edc26a2a3 | ||
| 
						 | 
					08bb619964 | ||
| 
						 | 
					26ef25f864 | ||
| 
						 | 
					a62084a4f0 | ||
| 
						 | 
					b8c298b734 | ||
| 
						 | 
					cf4d5d649a | ||
| 
						 | 
					eb2778ccad | ||
| 
						 | 
					790402bcfb | ||
| 
						 | 
					7c68770787 | ||
| 
						 | 
					d9faf7a833 | ||
| 
						 | 
					90ac03cae7 | ||
| 
						 | 
					3a667f558c | ||
| 
						 | 
					0a2930d861 | ||
| 
						 | 
					e86178b523 | ||
| 
						 | 
					10e15b524f | ||
| 
						 | 
					402ab29a73 | ||
| 
						 | 
					3df28f42ec | ||
| 
						 | 
					0e8896ad06 | ||
| 
						 | 
					ffd18049eb | ||
| 
						 | 
					7413e02a05 | ||
| 
						 | 
					0403248a8f | ||
| 
						 | 
					e6b2f9cde7 | ||
| 
						 | 
					2512a9c8e7 | ||
| 
						 | 
					5e7f6bb5bd | ||
| 
						 | 
					ae15bbd7b5 | ||
| 
						 | 
					33c0737933 | ||
| 
						 | 
					b26fcae690 | ||
| 
						 | 
					60baaf921f | ||
| 
						 | 
					f41e06061f | ||
| 
						 | 
					c170c56a84 | ||
| 
						 | 
					c9c392679d | ||
| 
						 | 
					47f5ae5f12 | ||
| 
						 | 
					6c34458d6c | ||
| 
						 | 
					ec40cc93ff | ||
| 
						 | 
					3681ef4e41 | ||
| 
						 | 
					e2fbf56277 | ||
| 
						 | 
					2d48de372b | ||
| 
						 | 
					c780ef8a0b | ||
| 
						 | 
					d833d36896 | ||
| 
						 | 
					7a2090bc00 | ||
| 
						 | 
					b5892dd139 | ||
| 
						 | 
					a172d0b7ea | ||
| 
						 | 
					e9ab081ab7 | ||
| 
						 | 
					caedb51f00 | ||
| 
						 | 
					e6abdda0a7 | ||
| 
						 | 
					46c96654ee | ||
| 
						 | 
					57ac234657 | ||
| 
						 | 
					4232359dce | ||
| 
						 | 
					8b1cab46e7 | ||
| 
						 | 
					e05505aa4f | ||
| 
						 | 
					73bc85864b | ||
| 
						 | 
					373430924b | ||
| 
						 | 
					8ad111655c | ||
| 
						 | 
					0a8470758d | ||
| 
						 | 
					1ec906addc | ||
| 
						 | 
					afc0a358d9 | ||
| 
						 | 
					af284dda37 | ||
| 
						 | 
					7558348d14 | ||
| 
						 | 
					0d262e74bc | ||
| 
						 | 
					312e7be2b4 | ||
| 
						 | 
					de9b79adf0 | ||
| 
						 | 
					6c68360234 | ||
| 
						 | 
					7e42507b9a | ||
| 
						 | 
					36bfcc7543 | ||
| 
						 | 
					4a5278a915 | ||
| 
						 | 
					333b73e882 | ||
| 
						 | 
					9420c506ca | ||
| 
						 | 
					707427c63a | ||
| 
						 | 
					5eea26d9ac | ||
| 
						 | 
					226d386be2 | ||
| 
						 | 
					c95d8f2f89 | ||
| 
						 | 
					ed5dfc6c0e | ||
| 
						 | 
					2600198bd5 | ||
| 
						 | 
					c83be63b9c | ||
| 
						 | 
					4aa2ca94de | ||
| 
						 | 
					87565b685a | ||
| 
						 | 
					e4d0c1ca48 | ||
| 
						 | 
					498232baf8 | ||
| 
						 | 
					43f4828a61 | ||
| 
						 | 
					1a298dedd2 | ||
| 
						 | 
					6c9c88e3fc | ||
| 
						 | 
					156b858db7 | ||
| 
						 | 
					cfffbfba9d | ||
| 
						 | 
					97a938a2a9 | ||
| 
						 | 
					63d664b9fb | ||
| 
						 | 
					40824812d6 | ||
| 
						 | 
					288ffb8fef | ||
| 
						 | 
					a9cf781ca5 | ||
| 
						 | 
					a446d85297 | ||
| 
						 | 
					dc18aefb33 | ||
| 
						 | 
					e312354016 | ||
| 
						 | 
					ba905e38ae | ||
| 
						 | 
					f35e5ac784 | ||
| 
						 | 
					a9b02fb292 | ||
| 
						 | 
					bc8a2c19aa | ||
| 
						 | 
					46b86a5d61 | ||
| 
						 | 
					3defcaecac | ||
| 
						 | 
					d7888d5556 | ||
| 
						 | 
					f518936e69 | ||
| 
						 | 
					9e35f16be1 | ||
| 
						 | 
					d048641242 | ||
| 
						 | 
					f347a732a6 | ||
| 
						 | 
					0e2ba4a64e | ||
| 
						 | 
					4a4f8842bd | ||
| 
						 | 
					a63805d631 | ||
| 
						 | 
					b3beb50e8f | ||
| 
						 | 
					0be712c363 | ||
| 
						 | 
					ad5f0642ba | ||
| 
						 | 
					4948882545 | ||
| 
						 | 
					5778363689 | ||
| 
						 | 
					d6fec5b5ff | ||
| 
						 | 
					e380214496 | ||
| 
						 | 
					1463b0e3e5 | ||
| 
						 | 
					60bbe1eb72 | ||
| 
						 | 
					b29e2e4c88 | ||
| 
						 | 
					bcaa5f3392 | ||
| 
						 | 
					3f0f20a542 | ||
| 
						 | 
					00333a8d16 | ||
| 
						 | 
					61c17400fe | ||
| 
						 | 
					d43002b49a | ||
| 
						 | 
					30880ad627 | ||
| 
						 | 
					25e55ef952 | ||
| 
						 | 
					579e6030ca | ||
| 
						 | 
					d93b23206e | ||
| 
						 | 
					1b63c3c315 | ||
| 
						 | 
					a8e61204da | ||
| 
						 | 
					bef24c1387 | ||
| 
						 | 
					b6c1e2578b | ||
| 
						 | 
					e0496aff5a | ||
| 
						 | 
					2f7adfb883 | ||
| 
						 | 
					0f1895947d | ||
| 
						 | 
					fa693b2aff | ||
| 
						 | 
					1825ea701f | ||
| 
						 | 
					2ae5b13fb9 | ||
| 
						 | 
					686a732fa8 | ||
| 
						 | 
					4919b57466 | ||
| 
						 | 
					44d39f335e | ||
| 
						 | 
					bfe5b52a64 | ||
| 
						 | 
					413b823976 | ||
| 
						 | 
					e664f0b9ce | ||
| 
						 | 
					907bd7a58f | ||
| 
						 | 
					f94a9864f0 | ||
| 
						 | 
					36ea0389e2 | ||
| 
						 | 
					12640de22d | ||
| 
						 | 
					ae4f2d9023 | ||
| 
						 | 
					b7b61ef61d | ||
| 
						 | 
					f391c3c899 | ||
| 
						 | 
					562ea41a64 | ||
| 
						 | 
					687b1e8887 | ||
| 
						 | 
					cc506fd094 | ||
| 
						 | 
					1fe323190a | ||
| 
						 | 
					379a44641b | ||
| 
						 | 
					18b8fc7e5c | ||
| 
						 | 
					be2d915df7 | ||
| 
						 | 
					57dda8ac50 | ||
| 
						 | 
					5cdd8a642f | ||
| 
						 | 
					8abc9c6645 | ||
| 
						 | 
					24e1aa9ae5 | ||
| 
						 | 
					9bee023105 | ||
| 
						 | 
					4ee3ef94d9 | ||
| 
						 | 
					8fcc2dfa19 | ||
| 
						 | 
					123e09695e | ||
| 
						 | 
					371237487b | ||
| 
						 | 
					d97f19ba1d | ||
| 
						 | 
					e92dbc8fce | ||
| 
						 | 
					769fdab6b7 | ||
| 
						 | 
					363344d36e | ||
| 
						 | 
					4f7e8194f0 | ||
| 
						 | 
					04c80c62f5 | ||
| 
						 | 
					92fdebf590 | ||
| 
						 | 
					b054a8424d | ||
| 
						 | 
					162b1305e0 | ||
| 
						 | 
					bdaa04d1ec | ||
| 
						 | 
					6c69453bda | ||
| 
						 | 
					7661ee6a3b | ||
| 
						 | 
					6cabe89601 | ||
| 
						 | 
					70f7635dda | ||
| 
						 | 
					c8574ea42a | ||
| 
						 | 
					e4fbf5131f | ||
| 
						 | 
					87ee358297 | ||
| 
						 | 
					27e29d0421 | ||
| 
						 | 
					63ec563135 | ||
| 
						 | 
					2c6f52a0ed | ||
| 
						 | 
					97956b1718 | ||
| 
						 | 
					ebfe4e6468 | ||
| 
						 | 
					534518f13e | ||
| 
						 | 
					4ed51c22d0 | ||
| 
						 | 
					4364c07f1e | ||
| 
						 | 
					f20efae75a | ||
| 
						 | 
					67b27ee344 | ||
| 
						 | 
					082f2fe21e | ||
| 
						 | 
					7584a683dd | ||
| 
						 | 
					f58c85d203 | ||
| 
						 | 
					95698ee2de | ||
| 
						 | 
					3d3db68508 | ||
| 
						 | 
					7fcabd1ce7 | ||
| 
						 | 
					59bb9a11ab | ||
| 
						 | 
					ac5fcc7f4b | ||
| 
						 | 
					3d0e722176 | ||
| 
						 | 
					93add775b2 | ||
| 
						 | 
					0273ba0da3 | ||
| 
						 | 
					276477c494 | ||
| 
						 | 
					d0b2a24a30 | ||
| 
						 | 
					e44a058b13 | ||
| 
						 | 
					743c9b92de | ||
| 
						 | 
					35c90e64ec | ||
| 
						 | 
					6e0d7a0fac | ||
| 
						 | 
					d3c98ab2a8 | ||
| 
						 | 
					2d172f470d | ||
| 
						 | 
					a68229e9d7 | ||
| 
						 | 
					cec8b29998 | ||
| 
						 | 
					13524be6cc | ||
| 
						 | 
					2bf582839e | ||
| 
						 | 
					ed47db7d39 | ||
| 
						 | 
					4994f9db92 | ||
| 
						 | 
					50851aed16 | ||
| 
						 | 
					4118fb2584 | ||
| 
						 | 
					837a547849 | ||
| 
						 | 
					b57618a211 | ||
| 
						 | 
					588ed91d1b | ||
| 
						 | 
					4904c4b4d4 | ||
| 
						 | 
					03070d7582 | ||
| 
						 | 
					b3f3259b14 | ||
| 
						 | 
					357b96ab0d | ||
| 
						 | 
					550f0fae85 | ||
| 
						 | 
					19257f8aa9 | ||
| 
						 | 
					49b4af1a56 | ||
| 
						 | 
					c7600057bc | ||
| 
						 | 
					0b7fd64a4c | ||
| 
						 | 
					ecdea015b9 | ||
| 
						 | 
					7588e9d5bf | ||
| 
						 | 
					bfa17134d2 | ||
| 
						 | 
					57b8ff1c49 | ||
| 
						 | 
					9b69da7f91 | ||
| 
						 | 
					09409fc05d | ||
| 
						 | 
					561eae1b7f | ||
| 
						 | 
					28062496eb | ||
| 
						 | 
					3e83b54332 | ||
| 
						 | 
					3e520c8742 | ||
| 
						 | 
					2a147b9487 | ||
| 
						 | 
					8aab33c18c | ||
| 
						 | 
					aef3119efb | 
@@ -16,6 +16,7 @@ coverage:
 | 
			
		||||
#
 | 
			
		||||
# More info: https://github.com/XRPLF/clio/pull/2066
 | 
			
		||||
ignore:
 | 
			
		||||
  - "benchmarks"
 | 
			
		||||
  - "tests"
 | 
			
		||||
  - "src/data/cassandra/"
 | 
			
		||||
  - "src/data/CassandraBackend.hpp"
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ inputs:
 | 
			
		||||
    description: Space-separated build target names
 | 
			
		||||
    default: all
 | 
			
		||||
  subtract_threads:
 | 
			
		||||
    description: An option for the action get_number_of_threads. See get_number_of_threads
 | 
			
		||||
    description: An option for the action get-threads-number.
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "0"
 | 
			
		||||
 | 
			
		||||
@@ -14,16 +14,18 @@ runs:
 | 
			
		||||
  using: composite
 | 
			
		||||
  steps:
 | 
			
		||||
    - name: Get number of threads
 | 
			
		||||
      uses: ./.github/actions/get_number_of_threads
 | 
			
		||||
      uses: ./.github/actions/get-threads-number
 | 
			
		||||
      id: number_of_threads
 | 
			
		||||
      with:
 | 
			
		||||
        subtract_threads: ${{ inputs.subtract_threads }}
 | 
			
		||||
 | 
			
		||||
    - name: Build targets
 | 
			
		||||
      shell: bash
 | 
			
		||||
      env:
 | 
			
		||||
        CMAKE_TARGETS: ${{ inputs.targets }}
 | 
			
		||||
      run: |
 | 
			
		||||
        cd build
 | 
			
		||||
        cmake \
 | 
			
		||||
          --build . \
 | 
			
		||||
          --parallel "${{ steps.number_of_threads.outputs.threads_number }}" \
 | 
			
		||||
          --target ${{ inputs.targets }}
 | 
			
		||||
          --target ${CMAKE_TARGETS}
 | 
			
		||||
@@ -5,9 +5,6 @@ inputs:
 | 
			
		||||
  images:
 | 
			
		||||
    description: Name of the images to use as a base name
 | 
			
		||||
    required: true
 | 
			
		||||
  dockerhub_repo:
 | 
			
		||||
    description: DockerHub repository name
 | 
			
		||||
    required: true
 | 
			
		||||
  push_image:
 | 
			
		||||
    description: Whether to push the image to the registry (true/false)
 | 
			
		||||
    required: true
 | 
			
		||||
@@ -20,23 +17,31 @@ inputs:
 | 
			
		||||
  platforms:
 | 
			
		||||
    description: Platforms to build the image for (e.g. linux/amd64,linux/arm64)
 | 
			
		||||
    required: true
 | 
			
		||||
  description:
 | 
			
		||||
  build_args:
 | 
			
		||||
    description: List of build-time variables
 | 
			
		||||
    required: false
 | 
			
		||||
 | 
			
		||||
  dockerhub_repo:
 | 
			
		||||
    description: DockerHub repository name
 | 
			
		||||
    required: false
 | 
			
		||||
    default: ""
 | 
			
		||||
  dockerhub_description:
 | 
			
		||||
    description: Short description of the image
 | 
			
		||||
    required: true
 | 
			
		||||
    required: false
 | 
			
		||||
 | 
			
		||||
runs:
 | 
			
		||||
  using: composite
 | 
			
		||||
  steps:
 | 
			
		||||
    - name: Login to DockerHub
 | 
			
		||||
      if: ${{ inputs.push_image == 'true' }}
 | 
			
		||||
      uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
 | 
			
		||||
      if: ${{ inputs.push_image == 'true' && inputs.dockerhub_repo != '' }}
 | 
			
		||||
      uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
 | 
			
		||||
      with:
 | 
			
		||||
        username: ${{ env.DOCKERHUB_USER }}
 | 
			
		||||
        password: ${{ env.DOCKERHUB_PW }}
 | 
			
		||||
 | 
			
		||||
    - name: Login to GitHub Container Registry
 | 
			
		||||
      if: ${{ inputs.push_image == 'true' }}
 | 
			
		||||
      uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
 | 
			
		||||
      uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
 | 
			
		||||
      with:
 | 
			
		||||
        registry: ghcr.io
 | 
			
		||||
        username: ${{ github.repository_owner }}
 | 
			
		||||
@@ -45,28 +50,19 @@ runs:
 | 
			
		||||
    - uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
 | 
			
		||||
      with:
 | 
			
		||||
        cache-image: false
 | 
			
		||||
    - uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3.10.0
 | 
			
		||||
    - uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
 | 
			
		||||
 | 
			
		||||
    - uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5.7.0
 | 
			
		||||
    - uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0
 | 
			
		||||
      id: meta
 | 
			
		||||
      with:
 | 
			
		||||
        images: ${{ inputs.images }}
 | 
			
		||||
        tags: ${{ inputs.tags }}
 | 
			
		||||
 | 
			
		||||
    - name: Build and push
 | 
			
		||||
      uses: docker/build-push-action@1dc73863535b631f98b2378be8619f83b136f4a0 # v6.17.0
 | 
			
		||||
      uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0
 | 
			
		||||
      with:
 | 
			
		||||
        context: ${{ inputs.directory }}
 | 
			
		||||
        platforms: ${{ inputs.platforms }}
 | 
			
		||||
        push: ${{ inputs.push_image == 'true' }}
 | 
			
		||||
        tags: ${{ steps.meta.outputs.tags }}
 | 
			
		||||
 | 
			
		||||
    - name: Update DockerHub description
 | 
			
		||||
      if: ${{ inputs.push_image == 'true' }}
 | 
			
		||||
      uses: peter-evans/dockerhub-description@432a30c9e07499fd01da9f8a49f0faf9e0ca5b77 # v4.0.2
 | 
			
		||||
      with:
 | 
			
		||||
        username: ${{ env.DOCKERHUB_USER }}
 | 
			
		||||
        password: ${{ env.DOCKERHUB_PW }}
 | 
			
		||||
        repository: ${{ inputs.dockerhub_repo }}
 | 
			
		||||
        short-description: ${{ inputs.description }}
 | 
			
		||||
        readme-filepath: ${{ inputs.directory }}/README.md
 | 
			
		||||
        build-args: ${{ inputs.build_args }}
 | 
			
		||||
							
								
								
									
										73
									
								
								.github/actions/cmake/action.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								.github/actions/cmake/action.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
name: Run CMake
 | 
			
		||||
description: Run CMake to generate build files
 | 
			
		||||
 | 
			
		||||
inputs:
 | 
			
		||||
  build_dir:
 | 
			
		||||
    description: Build directory
 | 
			
		||||
    required: false
 | 
			
		||||
    default: "build"
 | 
			
		||||
  conan_profile:
 | 
			
		||||
    description: Conan profile name
 | 
			
		||||
    required: true
 | 
			
		||||
  build_type:
 | 
			
		||||
    description: Build type for third-party libraries and clio. Could be 'Release', 'Debug'
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "Release"
 | 
			
		||||
  integration_tests:
 | 
			
		||||
    description: Whether to generate target integration tests
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "true"
 | 
			
		||||
  benchmark:
 | 
			
		||||
    description: Whether to generate targets for benchmarks
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "true"
 | 
			
		||||
  code_coverage:
 | 
			
		||||
    description: Whether to enable code coverage
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
  static:
 | 
			
		||||
    description: Whether Clio is to be statically linked
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
  time_trace:
 | 
			
		||||
    description: Whether to enable compiler trace reports
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
  package:
 | 
			
		||||
    description: Whether to generate Debian package
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
 | 
			
		||||
runs:
 | 
			
		||||
  using: composite
 | 
			
		||||
  steps:
 | 
			
		||||
    - name: Run cmake
 | 
			
		||||
      shell: bash
 | 
			
		||||
      env:
 | 
			
		||||
        BUILD_TYPE: "${{ inputs.build_type }}"
 | 
			
		||||
        SANITIZER_OPTION: |-
 | 
			
		||||
          ${{ endsWith(inputs.conan_profile, '.asan') && '-Dsan=address' ||
 | 
			
		||||
              endsWith(inputs.conan_profile, '.tsan') && '-Dsan=thread' ||
 | 
			
		||||
              endsWith(inputs.conan_profile, '.ubsan') && '-Dsan=undefined' ||
 | 
			
		||||
              '' }}
 | 
			
		||||
        INTEGRATION_TESTS: "${{ inputs.integration_tests == 'true' && 'ON' || 'OFF' }}"
 | 
			
		||||
        BENCHMARK: "${{ inputs.benchmark == 'true' && 'ON' || 'OFF' }}"
 | 
			
		||||
        COVERAGE: "${{ inputs.code_coverage == 'true' && 'ON' || 'OFF' }}"
 | 
			
		||||
        STATIC: "${{ inputs.static == 'true' && 'ON' || 'OFF' }}"
 | 
			
		||||
        TIME_TRACE: "${{ inputs.time_trace == 'true' && 'ON' || 'OFF' }}"
 | 
			
		||||
        PACKAGE: "${{ inputs.package == 'true' && 'ON' || 'OFF' }}"
 | 
			
		||||
      run: |
 | 
			
		||||
        cmake \
 | 
			
		||||
          -B ${{inputs.build_dir}} \
 | 
			
		||||
          -S . \
 | 
			
		||||
          -G Ninja \
 | 
			
		||||
          -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \
 | 
			
		||||
          -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \
 | 
			
		||||
          "${SANITIZER_OPTION}" \
 | 
			
		||||
          -Dtests=ON \
 | 
			
		||||
          -Dintegration_tests="${INTEGRATION_TESTS}" \
 | 
			
		||||
          -Dbenchmark="${BENCHMARK}" \
 | 
			
		||||
          -Dcoverage="${COVERAGE}" \
 | 
			
		||||
          -Dstatic="${STATIC}" \
 | 
			
		||||
          -Dtime_trace="${TIME_TRACE}" \
 | 
			
		||||
          -Dpackage="${PACKAGE}"
 | 
			
		||||
@@ -15,6 +15,7 @@ runs:
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        gcovr \
 | 
			
		||||
          -e benchmarks \
 | 
			
		||||
          -e tests \
 | 
			
		||||
          -e src/data/cassandra \
 | 
			
		||||
          -e src/data/CassandraBackend.hpp \
 | 
			
		||||
@@ -23,7 +24,7 @@ runs:
 | 
			
		||||
          -j8 --exclude-throw-branches
 | 
			
		||||
 | 
			
		||||
    - name: Archive coverage report
 | 
			
		||||
      uses: actions/upload-artifact@v4
 | 
			
		||||
      uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
 | 
			
		||||
      with:
 | 
			
		||||
        name: coverage-report.xml
 | 
			
		||||
        path: build/coverage_report.xml
 | 
			
		||||
							
								
								
									
										38
									
								
								.github/actions/conan/action.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								.github/actions/conan/action.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
name: Run Conan
 | 
			
		||||
description: Run conan to install dependencies
 | 
			
		||||
 | 
			
		||||
inputs:
 | 
			
		||||
  build_dir:
 | 
			
		||||
    description: Build directory
 | 
			
		||||
    required: false
 | 
			
		||||
    default: "build"
 | 
			
		||||
  conan_profile:
 | 
			
		||||
    description: Conan profile name
 | 
			
		||||
    required: true
 | 
			
		||||
  force_conan_source_build:
 | 
			
		||||
    description: Whether conan should build all dependencies from source
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
  build_type:
 | 
			
		||||
    description: Build type for third-party libraries and clio. Could be 'Release', 'Debug'
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "Release"
 | 
			
		||||
 | 
			
		||||
runs:
 | 
			
		||||
  using: composite
 | 
			
		||||
  steps:
 | 
			
		||||
    - name: Create build directory
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: mkdir -p "${{ inputs.build_dir }}"
 | 
			
		||||
 | 
			
		||||
    - name: Run conan
 | 
			
		||||
      shell: bash
 | 
			
		||||
      env:
 | 
			
		||||
        CONAN_BUILD_OPTION: "${{ inputs.force_conan_source_build == 'true' && '*' || 'missing' }}"
 | 
			
		||||
      run: |
 | 
			
		||||
        conan \
 | 
			
		||||
          install . \
 | 
			
		||||
          -of build \
 | 
			
		||||
          -b "$CONAN_BUILD_OPTION" \
 | 
			
		||||
          -s "build_type=${{ inputs.build_type }}" \
 | 
			
		||||
          --profile:all "${{ inputs.conan_profile }}"
 | 
			
		||||
@@ -28,12 +28,17 @@ runs:
 | 
			
		||||
    - name: Create an issue
 | 
			
		||||
      id: create_issue
 | 
			
		||||
      shell: bash
 | 
			
		||||
      env:
 | 
			
		||||
        ISSUE_BODY: ${{ inputs.body }}
 | 
			
		||||
        ISSUE_ASSIGNEES: ${{ inputs.assignees }}
 | 
			
		||||
        ISSUE_LABELS: ${{ inputs.labels }}
 | 
			
		||||
        ISSUE_TITLE: ${{ inputs.title }}
 | 
			
		||||
      run: |
 | 
			
		||||
        echo -e '${{ inputs.body }}' > issue.md
 | 
			
		||||
        echo -e "${ISSUE_BODY}" > issue.md
 | 
			
		||||
        gh issue create \
 | 
			
		||||
          --assignee '${{ inputs.assignees }}' \
 | 
			
		||||
          --label '${{ inputs.labels }}' \
 | 
			
		||||
          --title '${{ inputs.title }}' \
 | 
			
		||||
          --assignee "${ISSUE_ASSIGNEES}" \
 | 
			
		||||
          --label "${ISSUE_LABELS}" \
 | 
			
		||||
          --title "${ISSUE_TITLE}" \
 | 
			
		||||
          --body-file ./issue.md \
 | 
			
		||||
          > create_issue.log
 | 
			
		||||
        created_issue="$(sed 's|.*/||' create_issue.log)"
 | 
			
		||||
							
								
								
									
										88
									
								
								.github/actions/generate/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										88
									
								
								.github/actions/generate/action.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,88 +0,0 @@
 | 
			
		||||
name: Run conan and cmake
 | 
			
		||||
description: Run conan and cmake
 | 
			
		||||
 | 
			
		||||
inputs:
 | 
			
		||||
  conan_profile:
 | 
			
		||||
    description: Conan profile name
 | 
			
		||||
    required: true
 | 
			
		||||
  conan_cache_hit:
 | 
			
		||||
    description: Whether conan cache has been downloaded
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
  build_type:
 | 
			
		||||
    description: Build type for third-party libraries and clio. Could be 'Release', 'Debug'
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "Release"
 | 
			
		||||
  build_integration_tests:
 | 
			
		||||
    description: Whether to build integration tests
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "true"
 | 
			
		||||
  code_coverage:
 | 
			
		||||
    description: Whether conan's coverage option should be on or not
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
  static:
 | 
			
		||||
    description: Whether Clio is to be statically linked
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
  sanitizer:
 | 
			
		||||
    description: Sanitizer to use
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
    choices:
 | 
			
		||||
      - "false"
 | 
			
		||||
      - "tsan"
 | 
			
		||||
      - "asan"
 | 
			
		||||
      - "ubsan"
 | 
			
		||||
  time_trace:
 | 
			
		||||
    description: Whether to enable compiler trace reports
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
 | 
			
		||||
runs:
 | 
			
		||||
  using: composite
 | 
			
		||||
  steps:
 | 
			
		||||
    - name: Create build directory
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: mkdir -p build
 | 
			
		||||
 | 
			
		||||
    - name: Run conan
 | 
			
		||||
      shell: bash
 | 
			
		||||
      env:
 | 
			
		||||
        BUILD_OPTION: "${{ inputs.conan_cache_hit == 'true' && 'missing' || '' }}"
 | 
			
		||||
        CODE_COVERAGE: "${{ inputs.code_coverage == 'true' && 'True' || 'False' }}"
 | 
			
		||||
        STATIC_OPTION: "${{ inputs.static == 'true' && 'True' || 'False' }}"
 | 
			
		||||
        INTEGRATION_TESTS_OPTION: "${{ inputs.build_integration_tests == 'true' && 'True' || 'False' }}"
 | 
			
		||||
        TIME_TRACE: "${{ inputs.time_trace == 'true' && 'True' || 'False' }}"
 | 
			
		||||
      run: |
 | 
			
		||||
        cd build
 | 
			
		||||
        conan \
 | 
			
		||||
          install .. \
 | 
			
		||||
          -of . \
 | 
			
		||||
          -b $BUILD_OPTION \
 | 
			
		||||
          -s build_type="${{ inputs.build_type }}" \
 | 
			
		||||
          -o clio:static="${STATIC_OPTION}" \
 | 
			
		||||
          -o clio:tests=True \
 | 
			
		||||
          -o clio:integration_tests="${INTEGRATION_TESTS_OPTION}" \
 | 
			
		||||
          -o clio:lint=False \
 | 
			
		||||
          -o clio:coverage="${CODE_COVERAGE}" \
 | 
			
		||||
          -o clio:time_trace="${TIME_TRACE}" \
 | 
			
		||||
          --profile "${{ inputs.conan_profile }}"
 | 
			
		||||
 | 
			
		||||
    - name: Run cmake
 | 
			
		||||
      shell: bash
 | 
			
		||||
      env:
 | 
			
		||||
        BUILD_TYPE: "${{ inputs.build_type }}"
 | 
			
		||||
        SANITIZER_OPTION: |-
 | 
			
		||||
          ${{ inputs.sanitizer == 'tsan' && '-Dsan=thread' ||
 | 
			
		||||
              inputs.sanitizer == 'ubsan' && '-Dsan=undefined' ||
 | 
			
		||||
              inputs.sanitizer == 'asan' && '-Dsan=address' ||
 | 
			
		||||
              '' }}
 | 
			
		||||
      run: |
 | 
			
		||||
        cd build
 | 
			
		||||
        cmake \
 | 
			
		||||
          -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \
 | 
			
		||||
          -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \
 | 
			
		||||
          "${SANITIZER_OPTION}" \
 | 
			
		||||
          .. \
 | 
			
		||||
          -G Ninja
 | 
			
		||||
@@ -29,8 +29,10 @@ runs:
 | 
			
		||||
    - name: Shift and export number of threads
 | 
			
		||||
      id: number_of_threads_export
 | 
			
		||||
      shell: bash
 | 
			
		||||
      env:
 | 
			
		||||
        SUBTRACT_THREADS: ${{ inputs.subtract_threads }}
 | 
			
		||||
      run: |
 | 
			
		||||
        num_of_threads="${{ steps.mac_threads.outputs.num || steps.linux_threads.outputs.num }}"
 | 
			
		||||
        shift_by="${{ inputs.subtract_threads }}"
 | 
			
		||||
        shift_by="${SUBTRACT_THREADS}"
 | 
			
		||||
        shifted="$((num_of_threads - shift_by))"
 | 
			
		||||
        echo "num=$(( shifted > 1 ? shifted : 1 ))" >> $GITHUB_OUTPUT
 | 
			
		||||
							
								
								
									
										77
									
								
								.github/actions/prepare_runner/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										77
									
								
								.github/actions/prepare_runner/action.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,77 +0,0 @@
 | 
			
		||||
name: Prepare runner
 | 
			
		||||
description: Install packages, set environment variables, create directories
 | 
			
		||||
 | 
			
		||||
inputs:
 | 
			
		||||
  disable_ccache:
 | 
			
		||||
    description: Whether ccache should be disabled
 | 
			
		||||
    required: true
 | 
			
		||||
 | 
			
		||||
runs:
 | 
			
		||||
  using: composite
 | 
			
		||||
  steps:
 | 
			
		||||
    - name: Install packages on mac
 | 
			
		||||
      if: ${{ runner.os == 'macOS' }}
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        brew install \
 | 
			
		||||
          bison \
 | 
			
		||||
          ca-certificates \
 | 
			
		||||
          ccache \
 | 
			
		||||
          clang-build-analyzer \
 | 
			
		||||
          conan@1 \
 | 
			
		||||
          gh \
 | 
			
		||||
          jq \
 | 
			
		||||
          llvm@14 \
 | 
			
		||||
          ninja \
 | 
			
		||||
          pkg-config
 | 
			
		||||
        echo "/opt/homebrew/opt/conan@1/bin" >> $GITHUB_PATH
 | 
			
		||||
 | 
			
		||||
    - name: Install CMake 3.31.6 on mac
 | 
			
		||||
      if: ${{ runner.os == 'macOS' }}
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        # Uninstall any existing cmake
 | 
			
		||||
        brew uninstall cmake --ignore-dependencies || true
 | 
			
		||||
 | 
			
		||||
        # Download specific cmake formula
 | 
			
		||||
        FORMULA_URL="https://raw.githubusercontent.com/Homebrew/homebrew-core/b4e46db74e74a8c1650b38b1da222284ce1ec5ce/Formula/c/cmake.rb"
 | 
			
		||||
        FORMULA_EXPECTED_SHA256="c7ec95d86f0657638835441871e77541165e0a2581b53b3dd657cf13ad4228d4"
 | 
			
		||||
 | 
			
		||||
        mkdir -p /tmp/homebrew-formula
 | 
			
		||||
        curl -s -L "$FORMULA_URL" -o /tmp/homebrew-formula/cmake.rb
 | 
			
		||||
 | 
			
		||||
        echo "$FORMULA_EXPECTED_SHA256  /tmp/homebrew-formula/cmake.rb" | shasum -a 256 -c
 | 
			
		||||
 | 
			
		||||
        # Install cmake from the specific formula with force flag
 | 
			
		||||
        brew install --formula --force /tmp/homebrew-formula/cmake.rb
 | 
			
		||||
 | 
			
		||||
    - name: Fix git permissions on Linux
 | 
			
		||||
      if: ${{ runner.os == 'Linux' }}
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: git config --global --add safe.directory "$PWD"
 | 
			
		||||
 | 
			
		||||
    - name: Set env variables for macOS
 | 
			
		||||
      if: ${{ runner.os == 'macOS' }}
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        echo "CCACHE_DIR=${{ github.workspace }}/.ccache" >> $GITHUB_ENV
 | 
			
		||||
        echo "CONAN_USER_HOME=${{ github.workspace }}" >> $GITHUB_ENV
 | 
			
		||||
 | 
			
		||||
    - name: Set env variables for Linux
 | 
			
		||||
      if: ${{ runner.os == 'Linux' }}
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        echo "CCACHE_DIR=/root/.ccache" >> $GITHUB_ENV
 | 
			
		||||
        echo "CONAN_USER_HOME=/root/" >> $GITHUB_ENV
 | 
			
		||||
 | 
			
		||||
    - name: Set CCACHE_DISABLE=1
 | 
			
		||||
      if: ${{ inputs.disable_ccache == 'true' }}
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        echo "CCACHE_DISABLE=1" >> $GITHUB_ENV
 | 
			
		||||
 | 
			
		||||
    - name: Create directories
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        mkdir -p "$CCACHE_DIR"
 | 
			
		||||
        mkdir -p "$CONAN_USER_HOME/.conan"
 | 
			
		||||
							
								
								
									
										38
									
								
								.github/actions/restore-cache/action.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								.github/actions/restore-cache/action.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
name: Restore cache
 | 
			
		||||
description: Find and restores ccache cache
 | 
			
		||||
 | 
			
		||||
inputs:
 | 
			
		||||
  conan_profile:
 | 
			
		||||
    description: Conan profile name
 | 
			
		||||
    required: true
 | 
			
		||||
  ccache_dir:
 | 
			
		||||
    description: Path to .ccache directory
 | 
			
		||||
    required: true
 | 
			
		||||
  build_type:
 | 
			
		||||
    description: Current build type (e.g. Release, Debug)
 | 
			
		||||
    required: true
 | 
			
		||||
    default: Release
 | 
			
		||||
  code_coverage:
 | 
			
		||||
    description: Whether code coverage is on
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
 | 
			
		||||
outputs:
 | 
			
		||||
  ccache_cache_hit:
 | 
			
		||||
    description: True if ccache cache has been downloaded
 | 
			
		||||
    value: ${{ steps.ccache_cache.outputs.cache-hit }}
 | 
			
		||||
 | 
			
		||||
runs:
 | 
			
		||||
  using: composite
 | 
			
		||||
  steps:
 | 
			
		||||
    - name: Find common commit
 | 
			
		||||
      id: git_common_ancestor
 | 
			
		||||
      uses: ./.github/actions/git-common-ancestor
 | 
			
		||||
 | 
			
		||||
    - name: Restore ccache cache
 | 
			
		||||
      uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
 | 
			
		||||
      id: ccache_cache
 | 
			
		||||
      if: ${{ env.CCACHE_DISABLE != '1' }}
 | 
			
		||||
      with:
 | 
			
		||||
        path: ${{ inputs.ccache_dir }}
 | 
			
		||||
        key: clio-ccache-${{ runner.os }}-${{ inputs.build_type }}${{ inputs.code_coverage == 'true' && '-code_coverage' || '' }}-${{ inputs.conan_profile }}-develop-${{ steps.git_common_ancestor.outputs.commit }}
 | 
			
		||||
							
								
								
									
										64
									
								
								.github/actions/restore_cache/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								.github/actions/restore_cache/action.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,64 +0,0 @@
 | 
			
		||||
name: Restore cache
 | 
			
		||||
description: Find and restores conan and ccache cache
 | 
			
		||||
 | 
			
		||||
inputs:
 | 
			
		||||
  conan_dir:
 | 
			
		||||
    description: Path to .conan directory
 | 
			
		||||
    required: true
 | 
			
		||||
  conan_profile:
 | 
			
		||||
    description: Conan profile name
 | 
			
		||||
    required: true
 | 
			
		||||
  ccache_dir:
 | 
			
		||||
    description: Path to .ccache directory
 | 
			
		||||
    required: true
 | 
			
		||||
  build_type:
 | 
			
		||||
    description: Current build type (e.g. Release, Debug)
 | 
			
		||||
    required: true
 | 
			
		||||
    default: Release
 | 
			
		||||
  code_coverage:
 | 
			
		||||
    description: Whether code coverage is on
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
outputs:
 | 
			
		||||
  conan_hash:
 | 
			
		||||
    description: Hash to use as a part of conan cache key
 | 
			
		||||
    value: ${{ steps.conan_hash.outputs.hash }}
 | 
			
		||||
  conan_cache_hit:
 | 
			
		||||
    description: True if conan cache has been downloaded
 | 
			
		||||
    value: ${{ steps.conan_cache.outputs.cache-hit }}
 | 
			
		||||
  ccache_cache_hit:
 | 
			
		||||
    description: True if ccache cache has been downloaded
 | 
			
		||||
    value: ${{ steps.ccache_cache.outputs.cache-hit }}
 | 
			
		||||
 | 
			
		||||
runs:
 | 
			
		||||
  using: composite
 | 
			
		||||
  steps:
 | 
			
		||||
    - name: Find common commit
 | 
			
		||||
      id: git_common_ancestor
 | 
			
		||||
      uses: ./.github/actions/git_common_ancestor
 | 
			
		||||
 | 
			
		||||
    - name: Calculate conan hash
 | 
			
		||||
      id: conan_hash
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        conan info . -j info.json -o clio:tests=True
 | 
			
		||||
        packages_info="$(cat info.json | jq '.[] | "\(.display_name): \(.id)"' | grep -v 'clio')"
 | 
			
		||||
        echo "$packages_info"
 | 
			
		||||
        hash="$(echo "$packages_info" | shasum -a 256 | cut -d ' ' -f 1)"
 | 
			
		||||
        rm info.json
 | 
			
		||||
        echo "hash=$hash" >> $GITHUB_OUTPUT
 | 
			
		||||
 | 
			
		||||
    - name: Restore conan cache
 | 
			
		||||
      uses: actions/cache/restore@v4
 | 
			
		||||
      id: conan_cache
 | 
			
		||||
      with:
 | 
			
		||||
        path: ${{ inputs.conan_dir }}/data
 | 
			
		||||
        key: clio-conan_data-${{ runner.os }}-${{ inputs.build_type }}-${{ inputs.conan_profile }}-develop-${{ steps.conan_hash.outputs.hash }}
 | 
			
		||||
 | 
			
		||||
    - name: Restore ccache cache
 | 
			
		||||
      uses: actions/cache/restore@v4
 | 
			
		||||
      id: ccache_cache
 | 
			
		||||
      if: ${{ env.CCACHE_DISABLE != '1' }}
 | 
			
		||||
      with:
 | 
			
		||||
        path: ${{ inputs.ccache_dir }}
 | 
			
		||||
        key: clio-ccache-${{ runner.os }}-${{ inputs.build_type }}${{ inputs.code_coverage == 'true' && '-code_coverage' || '' }}-${{ inputs.conan_profile }}-develop-${{ steps.git_common_ancestor.outputs.commit }}
 | 
			
		||||
							
								
								
									
										38
									
								
								.github/actions/save-cache/action.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								.github/actions/save-cache/action.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
name: Save cache
 | 
			
		||||
description: Save ccache cache for develop branch
 | 
			
		||||
 | 
			
		||||
inputs:
 | 
			
		||||
  conan_profile:
 | 
			
		||||
    description: Conan profile name
 | 
			
		||||
    required: true
 | 
			
		||||
  ccache_dir:
 | 
			
		||||
    description: Path to .ccache directory
 | 
			
		||||
    required: true
 | 
			
		||||
  build_type:
 | 
			
		||||
    description: Current build type (e.g. Release, Debug)
 | 
			
		||||
    required: true
 | 
			
		||||
    default: Release
 | 
			
		||||
  code_coverage:
 | 
			
		||||
    description: Whether code coverage is on
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
 | 
			
		||||
  ccache_cache_hit:
 | 
			
		||||
    description: Whether ccache cache has been downloaded
 | 
			
		||||
    required: true
 | 
			
		||||
  ccache_cache_miss_rate:
 | 
			
		||||
    description: How many ccache cache misses happened
 | 
			
		||||
 | 
			
		||||
runs:
 | 
			
		||||
  using: composite
 | 
			
		||||
  steps:
 | 
			
		||||
    - name: Find common commit
 | 
			
		||||
      id: git_common_ancestor
 | 
			
		||||
      uses: ./.github/actions/git-common-ancestor
 | 
			
		||||
 | 
			
		||||
    - name: Save ccache cache
 | 
			
		||||
      if: ${{ inputs.ccache_cache_hit != 'true' || inputs.ccache_cache_miss_rate == '100.0' }}
 | 
			
		||||
      uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0
 | 
			
		||||
      with:
 | 
			
		||||
        path: ${{ inputs.ccache_dir }}
 | 
			
		||||
        key: clio-ccache-${{ runner.os }}-${{ inputs.build_type }}${{ inputs.code_coverage == 'true' && '-code_coverage' || '' }}-${{ inputs.conan_profile }}-develop-${{ steps.git_common_ancestor.outputs.commit }}
 | 
			
		||||
							
								
								
									
										59
									
								
								.github/actions/save_cache/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										59
									
								
								.github/actions/save_cache/action.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,59 +0,0 @@
 | 
			
		||||
name: Save cache
 | 
			
		||||
description: Save conan and ccache cache for develop branch
 | 
			
		||||
 | 
			
		||||
inputs:
 | 
			
		||||
  conan_dir:
 | 
			
		||||
    description: Path to .conan directory
 | 
			
		||||
    required: true
 | 
			
		||||
  conan_profile:
 | 
			
		||||
    description: Conan profile name
 | 
			
		||||
    required: true
 | 
			
		||||
  conan_hash:
 | 
			
		||||
    description: Hash to use as a part of conan cache key
 | 
			
		||||
    required: true
 | 
			
		||||
  conan_cache_hit:
 | 
			
		||||
    description: Whether conan cache has been downloaded
 | 
			
		||||
    required: true
 | 
			
		||||
  ccache_dir:
 | 
			
		||||
    description: Path to .ccache directory
 | 
			
		||||
    required: true
 | 
			
		||||
  ccache_cache_hit:
 | 
			
		||||
    description: Whether conan cache has been downloaded
 | 
			
		||||
    required: true
 | 
			
		||||
  ccache_cache_miss_rate:
 | 
			
		||||
    description: How many cache misses happened
 | 
			
		||||
  build_type:
 | 
			
		||||
    description: Current build type (e.g. Release, Debug)
 | 
			
		||||
    required: true
 | 
			
		||||
    default: Release
 | 
			
		||||
  code_coverage:
 | 
			
		||||
    description: Whether code coverage is on
 | 
			
		||||
    required: true
 | 
			
		||||
    default: "false"
 | 
			
		||||
 | 
			
		||||
runs:
 | 
			
		||||
  using: composite
 | 
			
		||||
  steps:
 | 
			
		||||
    - name: Find common commit
 | 
			
		||||
      id: git_common_ancestor
 | 
			
		||||
      uses: ./.github/actions/git_common_ancestor
 | 
			
		||||
 | 
			
		||||
    - name: Cleanup conan directory from extra data
 | 
			
		||||
      if: ${{ inputs.conan_cache_hit != 'true' }}
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        conan remove "*" -s -b -f
 | 
			
		||||
 | 
			
		||||
    - name: Save conan cache
 | 
			
		||||
      if: ${{ inputs.conan_cache_hit != 'true' }}
 | 
			
		||||
      uses: actions/cache/save@v4
 | 
			
		||||
      with:
 | 
			
		||||
        path: ${{ inputs.conan_dir }}/data
 | 
			
		||||
        key: clio-conan_data-${{ runner.os }}-${{ inputs.build_type }}-${{ inputs.conan_profile }}-develop-${{ inputs.conan_hash }}
 | 
			
		||||
 | 
			
		||||
    - name: Save ccache cache
 | 
			
		||||
      if: ${{ inputs.ccache_cache_hit != 'true' || inputs.ccache_cache_miss_rate == '100.0' }}
 | 
			
		||||
      uses: actions/cache/save@v4
 | 
			
		||||
      with:
 | 
			
		||||
        path: ${{ inputs.ccache_dir }}
 | 
			
		||||
        key: clio-ccache-${{ runner.os }}-${{ inputs.build_type }}${{ inputs.code_coverage == 'true' && '-code_coverage' || '' }}-${{ inputs.conan_profile }}-develop-${{ steps.git_common_ancestor.outputs.commit }}
 | 
			
		||||
							
								
								
									
										33
									
								
								.github/actions/setup_conan/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								.github/actions/setup_conan/action.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,33 +0,0 @@
 | 
			
		||||
name: Setup conan
 | 
			
		||||
description: Setup conan profile and artifactory
 | 
			
		||||
 | 
			
		||||
inputs:
 | 
			
		||||
  conan_profile:
 | 
			
		||||
    description: Conan profile name
 | 
			
		||||
    required: true
 | 
			
		||||
 | 
			
		||||
runs:
 | 
			
		||||
  using: composite
 | 
			
		||||
  steps:
 | 
			
		||||
    - name: Create conan profile on macOS
 | 
			
		||||
      if: ${{ runner.os == 'macOS' }}
 | 
			
		||||
      shell: bash
 | 
			
		||||
      env:
 | 
			
		||||
        CONAN_PROFILE: ${{ inputs.conan_profile }}
 | 
			
		||||
      run: |
 | 
			
		||||
        echo "Creating \"$CONAN_PROFILE\" conan profile"
 | 
			
		||||
        conan profile new "$CONAN_PROFILE" --detect --force
 | 
			
		||||
        conan profile update settings.compiler.libcxx=libc++ "$CONAN_PROFILE"
 | 
			
		||||
        conan profile update settings.compiler.cppstd=20 "$CONAN_PROFILE"
 | 
			
		||||
        conan profile update env.CXXFLAGS=-DBOOST_ASIO_DISABLE_CONCEPTS "$CONAN_PROFILE"
 | 
			
		||||
        conan profile update "conf.tools.build:cxxflags+=[\"-DBOOST_ASIO_DISABLE_CONCEPTS\"]" "$CONAN_PROFILE"
 | 
			
		||||
 | 
			
		||||
    - name: Add conan-non-prod artifactory
 | 
			
		||||
      shell: bash
 | 
			
		||||
      run: |
 | 
			
		||||
        if [[ -z "$(conan remote list | grep conan-non-prod)" ]]; then
 | 
			
		||||
            echo "Adding conan-non-prod"
 | 
			
		||||
            conan remote add --insert 0 conan-non-prod http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
 | 
			
		||||
        else
 | 
			
		||||
            echo "Conan-non-prod is available"
 | 
			
		||||
        fi
 | 
			
		||||
							
								
								
									
										33
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
								
							@@ -14,7 +14,7 @@ updates:
 | 
			
		||||
    target-branch: develop
 | 
			
		||||
 | 
			
		||||
  - package-ecosystem: github-actions
 | 
			
		||||
    directory: .github/actions/build_clio/
 | 
			
		||||
    directory: .github/actions/build-clio/
 | 
			
		||||
    schedule:
 | 
			
		||||
      interval: weekly
 | 
			
		||||
      day: monday
 | 
			
		||||
@@ -27,7 +27,7 @@ updates:
 | 
			
		||||
    target-branch: develop
 | 
			
		||||
 | 
			
		||||
  - package-ecosystem: github-actions
 | 
			
		||||
    directory: .github/actions/build_docker_image/
 | 
			
		||||
    directory: .github/actions/build-docker-image/
 | 
			
		||||
    schedule:
 | 
			
		||||
      interval: weekly
 | 
			
		||||
      day: monday
 | 
			
		||||
@@ -40,7 +40,7 @@ updates:
 | 
			
		||||
    target-branch: develop
 | 
			
		||||
 | 
			
		||||
  - package-ecosystem: github-actions
 | 
			
		||||
    directory: .github/actions/code_coverage/
 | 
			
		||||
    directory: .github/actions/cmake/
 | 
			
		||||
    schedule:
 | 
			
		||||
      interval: weekly
 | 
			
		||||
      day: monday
 | 
			
		||||
@@ -53,7 +53,7 @@ updates:
 | 
			
		||||
    target-branch: develop
 | 
			
		||||
 | 
			
		||||
  - package-ecosystem: github-actions
 | 
			
		||||
    directory: .github/actions/create_issue/
 | 
			
		||||
    directory: .github/actions/code-coverage/
 | 
			
		||||
    schedule:
 | 
			
		||||
      interval: weekly
 | 
			
		||||
      day: monday
 | 
			
		||||
@@ -66,7 +66,7 @@ updates:
 | 
			
		||||
    target-branch: develop
 | 
			
		||||
 | 
			
		||||
  - package-ecosystem: github-actions
 | 
			
		||||
    directory: .github/actions/generate/
 | 
			
		||||
    directory: .github/actions/conan/
 | 
			
		||||
    schedule:
 | 
			
		||||
      interval: weekly
 | 
			
		||||
      day: monday
 | 
			
		||||
@@ -79,7 +79,7 @@ updates:
 | 
			
		||||
    target-branch: develop
 | 
			
		||||
 | 
			
		||||
  - package-ecosystem: github-actions
 | 
			
		||||
    directory: .github/actions/get_number_of_threads/
 | 
			
		||||
    directory: .github/actions/create-issue/
 | 
			
		||||
    schedule:
 | 
			
		||||
      interval: weekly
 | 
			
		||||
      day: monday
 | 
			
		||||
@@ -92,7 +92,7 @@ updates:
 | 
			
		||||
    target-branch: develop
 | 
			
		||||
 | 
			
		||||
  - package-ecosystem: github-actions
 | 
			
		||||
    directory: .github/actions/git_common_ancestor/
 | 
			
		||||
    directory: .github/actions/get-threads-number/
 | 
			
		||||
    schedule:
 | 
			
		||||
      interval: weekly
 | 
			
		||||
      day: monday
 | 
			
		||||
@@ -105,7 +105,7 @@ updates:
 | 
			
		||||
    target-branch: develop
 | 
			
		||||
 | 
			
		||||
  - package-ecosystem: github-actions
 | 
			
		||||
    directory: .github/actions/prepare_runner/
 | 
			
		||||
    directory: .github/actions/git-common-ancestor/
 | 
			
		||||
    schedule:
 | 
			
		||||
      interval: weekly
 | 
			
		||||
      day: monday
 | 
			
		||||
@@ -118,7 +118,7 @@ updates:
 | 
			
		||||
    target-branch: develop
 | 
			
		||||
 | 
			
		||||
  - package-ecosystem: github-actions
 | 
			
		||||
    directory: .github/actions/restore_cache/
 | 
			
		||||
    directory: .github/actions/restore-cache/
 | 
			
		||||
    schedule:
 | 
			
		||||
      interval: weekly
 | 
			
		||||
      day: monday
 | 
			
		||||
@@ -131,20 +131,7 @@ updates:
 | 
			
		||||
    target-branch: develop
 | 
			
		||||
 | 
			
		||||
  - package-ecosystem: github-actions
 | 
			
		||||
    directory: .github/actions/save_cache/
 | 
			
		||||
    schedule:
 | 
			
		||||
      interval: weekly
 | 
			
		||||
      day: monday
 | 
			
		||||
      time: "04:00"
 | 
			
		||||
      timezone: Etc/GMT
 | 
			
		||||
    reviewers:
 | 
			
		||||
      - XRPLF/clio-dev-team
 | 
			
		||||
    commit-message:
 | 
			
		||||
      prefix: "ci: [DEPENDABOT] "
 | 
			
		||||
    target-branch: develop
 | 
			
		||||
 | 
			
		||||
  - package-ecosystem: github-actions
 | 
			
		||||
    directory: .github/actions/setup_conan/
 | 
			
		||||
    directory: .github/actions/save-cache/
 | 
			
		||||
    schedule:
 | 
			
		||||
      interval: weekly
 | 
			
		||||
      day: monday
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								.github/scripts/conan/apple-clang-17.profile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								.github/scripts/conan/apple-clang-17.profile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
[settings]
 | 
			
		||||
arch={{detect_api.detect_arch()}}
 | 
			
		||||
build_type=Release
 | 
			
		||||
compiler=apple-clang
 | 
			
		||||
compiler.cppstd=20
 | 
			
		||||
compiler.libcxx=libc++
 | 
			
		||||
compiler.version=17
 | 
			
		||||
os=Macos
 | 
			
		||||
 | 
			
		||||
[conf]
 | 
			
		||||
grpc/1.50.1:tools.build:cxxflags+=["-Wno-missing-template-arg-list-after-template-kw"]
 | 
			
		||||
							
								
								
									
										41
									
								
								.github/scripts/conan/generate_matrix.py
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										41
									
								
								.github/scripts/conan/generate_matrix.py
									
									
									
									
										vendored
									
									
										Executable file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
#!/usr/bin/env python3
 | 
			
		||||
import itertools
 | 
			
		||||
import json
 | 
			
		||||
 | 
			
		||||
LINUX_OS = ["heavy", "heavy-arm64"]
 | 
			
		||||
LINUX_CONTAINERS = [
 | 
			
		||||
    '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
]
 | 
			
		||||
LINUX_COMPILERS = ["gcc", "clang"]
 | 
			
		||||
 | 
			
		||||
MACOS_OS = ["macos15"]
 | 
			
		||||
MACOS_CONTAINERS = [""]
 | 
			
		||||
MACOS_COMPILERS = ["apple-clang"]
 | 
			
		||||
 | 
			
		||||
BUILD_TYPES = ["Release", "Debug"]
 | 
			
		||||
SANITIZER_EXT = [".asan", ".tsan", ".ubsan", ""]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def generate_matrix():
 | 
			
		||||
    configurations = []
 | 
			
		||||
 | 
			
		||||
    for os, container, compiler in itertools.chain(
 | 
			
		||||
        itertools.product(LINUX_OS, LINUX_CONTAINERS, LINUX_COMPILERS),
 | 
			
		||||
        itertools.product(MACOS_OS, MACOS_CONTAINERS, MACOS_COMPILERS),
 | 
			
		||||
    ):
 | 
			
		||||
        for sanitizer_ext, build_type in itertools.product(SANITIZER_EXT, BUILD_TYPES):
 | 
			
		||||
            configurations.append(
 | 
			
		||||
                {
 | 
			
		||||
                    "os": os,
 | 
			
		||||
                    "container": container,
 | 
			
		||||
                    "compiler": compiler,
 | 
			
		||||
                    "sanitizer_ext": sanitizer_ext,
 | 
			
		||||
                    "build_type": build_type,
 | 
			
		||||
                }
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
    return {"include": configurations}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    print(f"matrix={json.dumps(generate_matrix())}")
 | 
			
		||||
							
								
								
									
										48
									
								
								.github/scripts/conan/init.sh
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										48
									
								
								.github/scripts/conan/init.sh
									
									
									
									
										vendored
									
									
										Executable file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
set -ex
 | 
			
		||||
 | 
			
		||||
CURRENT_DIR="$(cd "$(dirname "$0")" && pwd)"
 | 
			
		||||
REPO_DIR="$(cd "$CURRENT_DIR/../../../" && pwd)"
 | 
			
		||||
 | 
			
		||||
CONAN_DIR="${CONAN_HOME:-$HOME/.conan2}"
 | 
			
		||||
PROFILES_DIR="$CONAN_DIR/profiles"
 | 
			
		||||
 | 
			
		||||
# When developers' compilers are updated, these profiles might be different
 | 
			
		||||
if [[ -z "$CI" ]]; then
 | 
			
		||||
    APPLE_CLANG_PROFILE="$CURRENT_DIR/apple-clang-17.profile"
 | 
			
		||||
else
 | 
			
		||||
    APPLE_CLANG_PROFILE="$CURRENT_DIR/apple-clang-17.profile"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
GCC_PROFILE="$REPO_DIR/docker/ci/conan/gcc.profile"
 | 
			
		||||
CLANG_PROFILE="$REPO_DIR/docker/ci/conan/clang.profile"
 | 
			
		||||
 | 
			
		||||
SANITIZER_TEMPLATE_FILE="$REPO_DIR/docker/ci/conan/sanitizer_template.profile"
 | 
			
		||||
 | 
			
		||||
rm -rf "$CONAN_DIR"
 | 
			
		||||
 | 
			
		||||
conan remote add --index 0 xrplf https://conan.ripplex.io
 | 
			
		||||
 | 
			
		||||
cp "$REPO_DIR/docker/ci/conan/global.conf" "$CONAN_DIR/global.conf"
 | 
			
		||||
 | 
			
		||||
create_profile_with_sanitizers() {
 | 
			
		||||
    profile_name="$1"
 | 
			
		||||
    profile_source="$2"
 | 
			
		||||
 | 
			
		||||
    cp "$profile_source" "$PROFILES_DIR/$profile_name"
 | 
			
		||||
    cp "$SANITIZER_TEMPLATE_FILE" "$PROFILES_DIR/$profile_name.asan"
 | 
			
		||||
    cp "$SANITIZER_TEMPLATE_FILE" "$PROFILES_DIR/$profile_name.tsan"
 | 
			
		||||
    cp "$SANITIZER_TEMPLATE_FILE" "$PROFILES_DIR/$profile_name.ubsan"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mkdir -p "$PROFILES_DIR"
 | 
			
		||||
 | 
			
		||||
if [[ "$(uname)" == "Darwin" ]]; then
 | 
			
		||||
    create_profile_with_sanitizers "apple-clang" "$APPLE_CLANG_PROFILE"
 | 
			
		||||
    echo "include(apple-clang)" > "$PROFILES_DIR/default"
 | 
			
		||||
else
 | 
			
		||||
    create_profile_with_sanitizers "clang" "$CLANG_PROFILE"
 | 
			
		||||
    create_profile_with_sanitizers "gcc" "$GCC_PROFILE"
 | 
			
		||||
    echo "include(gcc)" > "$PROFILES_DIR/default"
 | 
			
		||||
fi
 | 
			
		||||
@@ -31,15 +31,16 @@ TESTS=$($TEST_BINARY --gtest_list_tests | awk '/^  / {print suite $1} !/^  / {su
 | 
			
		||||
OUTPUT_DIR="./.sanitizer-report"
 | 
			
		||||
mkdir -p "$OUTPUT_DIR"
 | 
			
		||||
 | 
			
		||||
export TSAN_OPTIONS="die_after_fork=0"
 | 
			
		||||
export MallocNanoZone='0' # for MacOSX
 | 
			
		||||
 | 
			
		||||
for TEST in $TESTS; do
 | 
			
		||||
  OUTPUT_FILE="$OUTPUT_DIR/${TEST//\//_}"
 | 
			
		||||
  export TSAN_OPTIONS="log_path=\"$OUTPUT_FILE\" die_after_fork=0"
 | 
			
		||||
  export ASAN_OPTIONS="log_path=\"$OUTPUT_FILE\""
 | 
			
		||||
  export UBSAN_OPTIONS="log_path=\"$OUTPUT_FILE\""
 | 
			
		||||
  export MallocNanoZone='0' # for MacOSX
 | 
			
		||||
  $TEST_BINARY --gtest_filter="$TEST" > /dev/null 2>&1
 | 
			
		||||
  OUTPUT_FILE="$OUTPUT_DIR/${TEST//\//_}.log"
 | 
			
		||||
  $TEST_BINARY --gtest_filter="$TEST" > "$OUTPUT_FILE" 2>&1
 | 
			
		||||
 | 
			
		||||
  if [ $? -ne 0 ]; then
 | 
			
		||||
    echo "'$TEST' failed a sanitizer check."
 | 
			
		||||
  else
 | 
			
		||||
    rm "$OUTPUT_FILE"
 | 
			
		||||
  fi
 | 
			
		||||
done
 | 
			
		||||
							
								
								
									
										24
									
								
								.github/scripts/prepare-release-artifacts.sh
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										24
									
								
								.github/scripts/prepare-release-artifacts.sh
									
									
									
									
										vendored
									
									
										Executable file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
set -ex -o pipefail
 | 
			
		||||
 | 
			
		||||
BINARY_NAME="clio_server"
 | 
			
		||||
 | 
			
		||||
ARTIFACTS_DIR="$1"
 | 
			
		||||
if [ -z "${ARTIFACTS_DIR}" ]; then
 | 
			
		||||
    echo "Usage: $0 <artifacts_directory>"
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
cd "${ARTIFACTS_DIR}" || exit 1
 | 
			
		||||
 | 
			
		||||
for artifact_name in $(ls); do
 | 
			
		||||
    pushd "${artifact_name}" || exit 1
 | 
			
		||||
    zip -r "../${artifact_name}.zip" ./${BINARY_NAME}
 | 
			
		||||
    popd || exit 1
 | 
			
		||||
 | 
			
		||||
    rm "${artifact_name}/${BINARY_NAME}"
 | 
			
		||||
    rm -r "${artifact_name}"
 | 
			
		||||
 | 
			
		||||
    sha256sum "./${artifact_name}.zip" > "./${artifact_name}.zip.sha256sum"
 | 
			
		||||
done
 | 
			
		||||
							
								
								
									
										28
									
								
								.github/scripts/update-libxrpl-version
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								.github/scripts/update-libxrpl-version
									
									
									
									
										vendored
									
									
								
							@@ -1,28 +0,0 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
# Note: This script is intended to be run from the root of the repository.
 | 
			
		||||
#
 | 
			
		||||
# This script modifies conanfile.py such that the specified version of libXRPL is used.
 | 
			
		||||
 | 
			
		||||
if [[ -z "$1" ]]; then
 | 
			
		||||
    cat <<EOF
 | 
			
		||||
 | 
			
		||||
                                    ERROR
 | 
			
		||||
-----------------------------------------------------------------------------
 | 
			
		||||
            Version should be passed as first argument to the script.
 | 
			
		||||
-----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
EOF
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
VERSION=$1
 | 
			
		||||
GNU_SED=$(sed --version 2>&1 | grep -q 'GNU' && echo true || echo false)
 | 
			
		||||
 | 
			
		||||
echo "+ Updating required libXRPL version to $VERSION"
 | 
			
		||||
 | 
			
		||||
if [[ "$GNU_SED" == "false" ]]; then
 | 
			
		||||
    sed -i '' -E "s|'xrpl/[a-zA-Z0-9\\.\\-]+'|'xrpl/$VERSION'|g" conanfile.py
 | 
			
		||||
else
 | 
			
		||||
    sed -i -E "s|'xrpl/[a-zA-Z0-9\\.\\-]+'|'xrpl/$VERSION'|g" conanfile.py
 | 
			
		||||
fi
 | 
			
		||||
@@ -44,11 +44,11 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Download Clio binary from artifact
 | 
			
		||||
        if: ${{ inputs.artifact_name != null }}
 | 
			
		||||
        uses: actions/download-artifact@v4
 | 
			
		||||
        uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          name: ${{ inputs.artifact_name }}
 | 
			
		||||
          path: ./docker/clio/artifact/
 | 
			
		||||
@@ -56,9 +56,12 @@ jobs:
 | 
			
		||||
      - name: Download Clio binary from url
 | 
			
		||||
        if: ${{ inputs.clio_server_binary_url != null }}
 | 
			
		||||
        shell: bash
 | 
			
		||||
        env:
 | 
			
		||||
          BINARY_URL: ${{ inputs.clio_server_binary_url }}
 | 
			
		||||
          BINARY_SHA256: ${{ inputs.binary_sha256 }}
 | 
			
		||||
        run: |
 | 
			
		||||
          wget "${{inputs.clio_server_binary_url}}" -P ./docker/clio/artifact/
 | 
			
		||||
          if [ "$(sha256sum ./docker/clio/clio_server | awk '{print $1}')" != "${{inputs.binary_sha256}}" ]; then
 | 
			
		||||
          wget "${BINARY_URL}" -P ./docker/clio/artifact/
 | 
			
		||||
          if [ "$(sha256sum ./docker/clio/clio_server | awk '{print $1}')" != "${BINARY_SHA256}" ]; then
 | 
			
		||||
            echo "Binary sha256 sum doesn't match"
 | 
			
		||||
            exit 1
 | 
			
		||||
          fi
 | 
			
		||||
@@ -73,7 +76,8 @@ jobs:
 | 
			
		||||
          elif [[ $artifact == *.tar.gz ]]; then
 | 
			
		||||
            tar -xvf $artifact
 | 
			
		||||
          fi
 | 
			
		||||
          mv clio_server ../
 | 
			
		||||
          chmod +x ./clio_server
 | 
			
		||||
          mv ./clio_server ../
 | 
			
		||||
          cd ../
 | 
			
		||||
          rm -rf ./artifact
 | 
			
		||||
 | 
			
		||||
@@ -82,19 +86,24 @@ jobs:
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: strip ./docker/clio/clio_server
 | 
			
		||||
 | 
			
		||||
      - name: Set GHCR_REPO
 | 
			
		||||
        id: set-ghcr-repo
 | 
			
		||||
        run: |
 | 
			
		||||
          echo "GHCR_REPO=$(echo ghcr.io/${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> ${GITHUB_OUTPUT}
 | 
			
		||||
 | 
			
		||||
      - name: Build Docker image
 | 
			
		||||
        uses: ./.github/actions/build_docker_image
 | 
			
		||||
        uses: ./.github/actions/build-docker-image
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
          DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
 | 
			
		||||
          DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        with:
 | 
			
		||||
          images: |
 | 
			
		||||
            rippleci/clio
 | 
			
		||||
            ghcr.io/xrplf/clio
 | 
			
		||||
          dockerhub_repo: rippleci/clio
 | 
			
		||||
            ghcr.io/${{ steps.set-ghcr-repo.outputs.GHCR_REPO }}/clio
 | 
			
		||||
            ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio' || '' }}
 | 
			
		||||
          push_image: ${{ inputs.publish_image }}
 | 
			
		||||
          directory: docker/clio
 | 
			
		||||
          tags: ${{ inputs.tags }}
 | 
			
		||||
          platforms: linux/amd64
 | 
			
		||||
          description: Clio is an XRP Ledger API server.
 | 
			
		||||
          dockerhub_repo: ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio' || '' }}
 | 
			
		||||
          dockerhub_description: Clio is an XRP Ledger API server.
 | 
			
		||||
							
								
								
									
										84
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										84
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@@ -2,22 +2,24 @@ name: Build
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches: [master, release/*, develop]
 | 
			
		||||
    branches: [release/*, develop]
 | 
			
		||||
  pull_request:
 | 
			
		||||
    branches: [master, release/*, develop]
 | 
			
		||||
    branches: [release/*, develop]
 | 
			
		||||
    paths:
 | 
			
		||||
      - .github/workflows/build.yml
 | 
			
		||||
 | 
			
		||||
      - .github/workflows/build_and_test.yml
 | 
			
		||||
      - .github/workflows/build_impl.yml
 | 
			
		||||
      - .github/workflows/test_impl.yml
 | 
			
		||||
      - .github/workflows/upload_coverage_report.yml
 | 
			
		||||
      - .github/workflows/reusable-build-test.yml
 | 
			
		||||
      - .github/workflows/reusable-build.yml
 | 
			
		||||
      - .github/workflows/reusable-test.yml
 | 
			
		||||
      - .github/workflows/reusable-upload-coverage-report.yml
 | 
			
		||||
 | 
			
		||||
      - ".github/actions/**"
 | 
			
		||||
      - "!.github/actions/build_docker_image/**"
 | 
			
		||||
      - "!.github/actions/create_issue/**"
 | 
			
		||||
      - "!.github/actions/build-docker-image/**"
 | 
			
		||||
      - "!.github/actions/create-issue/**"
 | 
			
		||||
 | 
			
		||||
      - CMakeLists.txt
 | 
			
		||||
      - conanfile.py
 | 
			
		||||
      - conan.lock
 | 
			
		||||
      - "cmake/**"
 | 
			
		||||
      - "src/**"
 | 
			
		||||
      - "tests/**"
 | 
			
		||||
@@ -26,8 +28,9 @@ on:
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
concurrency:
 | 
			
		||||
  # Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
 | 
			
		||||
  group: ${{ github.workflow }}-${{ github.ref }}
 | 
			
		||||
  # Develop branch: Each run gets unique group (using run_number) for parallel execution
 | 
			
		||||
  # Other branches: Shared group with cancel-in-progress to stop old runs when new commits are pushed
 | 
			
		||||
  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref == 'refs/heads/develop' && github.run_number || 'branch' }}
 | 
			
		||||
  cancel-in-progress: true
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
@@ -40,22 +43,27 @@ jobs:
 | 
			
		||||
        os: [heavy]
 | 
			
		||||
        conan_profile: [gcc, clang]
 | 
			
		||||
        build_type: [Release, Debug]
 | 
			
		||||
        container: ['{ "image": "ghcr.io/xrplf/clio-ci:latest" }']
 | 
			
		||||
        container:
 | 
			
		||||
          [
 | 
			
		||||
            '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }',
 | 
			
		||||
          ]
 | 
			
		||||
        static: [true]
 | 
			
		||||
 | 
			
		||||
        include:
 | 
			
		||||
          - os: macos15
 | 
			
		||||
            conan_profile: default_apple_clang
 | 
			
		||||
            conan_profile: apple-clang
 | 
			
		||||
            build_type: Release
 | 
			
		||||
            container: ""
 | 
			
		||||
            static: false
 | 
			
		||||
 | 
			
		||||
    uses: ./.github/workflows/build_and_test.yml
 | 
			
		||||
    uses: ./.github/workflows/reusable-build-test.yml
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: ${{ matrix.os }}
 | 
			
		||||
      container: ${{ matrix.container }}
 | 
			
		||||
      conan_profile: ${{ matrix.conan_profile }}
 | 
			
		||||
      build_type: ${{ matrix.build_type }}
 | 
			
		||||
      download_ccache: true
 | 
			
		||||
      upload_ccache: true
 | 
			
		||||
      static: ${{ matrix.static }}
 | 
			
		||||
      run_unit_tests: true
 | 
			
		||||
      run_integration_tests: false
 | 
			
		||||
@@ -64,33 +72,51 @@ jobs:
 | 
			
		||||
  code_coverage:
 | 
			
		||||
    name: Run Code Coverage
 | 
			
		||||
 | 
			
		||||
    uses: ./.github/workflows/build_impl.yml
 | 
			
		||||
    uses: ./.github/workflows/reusable-build.yml
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: heavy
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-ci:latest" }'
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
      conan_profile: gcc
 | 
			
		||||
      build_type: Debug
 | 
			
		||||
      disable_cache: false
 | 
			
		||||
      download_ccache: true
 | 
			
		||||
      upload_ccache: false
 | 
			
		||||
      code_coverage: true
 | 
			
		||||
      static: true
 | 
			
		||||
      upload_clio_server: false
 | 
			
		||||
      targets: all
 | 
			
		||||
      sanitizer: "false"
 | 
			
		||||
      analyze_build_time: false
 | 
			
		||||
    secrets:
 | 
			
		||||
      CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
 | 
			
		||||
 | 
			
		||||
  package:
 | 
			
		||||
    name: Build packages
 | 
			
		||||
 | 
			
		||||
    uses: ./.github/workflows/reusable-build.yml
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: heavy
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
      conan_profile: gcc
 | 
			
		||||
      build_type: Release
 | 
			
		||||
      download_ccache: true
 | 
			
		||||
      upload_ccache: false
 | 
			
		||||
      code_coverage: false
 | 
			
		||||
      static: true
 | 
			
		||||
      upload_clio_server: false
 | 
			
		||||
      package: true
 | 
			
		||||
      targets: package
 | 
			
		||||
      analyze_build_time: false
 | 
			
		||||
 | 
			
		||||
  check_config:
 | 
			
		||||
    name: Check Config Description
 | 
			
		||||
    needs: build-and-test
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    container:
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:latest
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - uses: actions/download-artifact@v4
 | 
			
		||||
      - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          name: clio_server_Linux_Release_gcc
 | 
			
		||||
 | 
			
		||||
@@ -98,23 +124,9 @@ jobs:
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          repoConfigFile=docs/config-description.md
 | 
			
		||||
          if ! [ -f "${repoConfigFile}" ]; then
 | 
			
		||||
            echo "Config Description markdown file is missing in docs folder"
 | 
			
		||||
            exit 1
 | 
			
		||||
          fi
 | 
			
		||||
          configDescriptionFile=config_description_new.md
 | 
			
		||||
 | 
			
		||||
          chmod +x ./clio_server
 | 
			
		||||
          configDescriptionFile=config_description_new.md
 | 
			
		||||
          ./clio_server -d "${configDescriptionFile}"
 | 
			
		||||
 | 
			
		||||
          configDescriptionHash=$(sha256sum "${configDescriptionFile}" | cut -d' ' -f1)
 | 
			
		||||
          repoConfigHash=$(sha256sum "${repoConfigFile}" | cut -d' ' -f1)
 | 
			
		||||
 | 
			
		||||
          if [ "${configDescriptionHash}" != "${repoConfigHash}" ]; then
 | 
			
		||||
            echo "Markdown file is not up to date"
 | 
			
		||||
            diff -u "${repoConfigFile}" "${configDescriptionFile}"
 | 
			
		||||
            rm -f "${configDescriptionFile}"
 | 
			
		||||
            exit 1
 | 
			
		||||
          fi
 | 
			
		||||
          rm -f "${configDescriptionFile}"
 | 
			
		||||
          exit 0
 | 
			
		||||
          diff -u "${repoConfigFile}" "${configDescriptionFile}"
 | 
			
		||||
 
 | 
			
		||||
@@ -15,45 +15,49 @@ env:
 | 
			
		||||
jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    name: Build Clio / `libXRPL ${{ github.event.client_payload.version }}`
 | 
			
		||||
    runs-on: [self-hosted, heavy]
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    container:
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:latest
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: true
 | 
			
		||||
 | 
			
		||||
      - name: Update libXRPL version requirement
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          ./.github/scripts/update-libxrpl-version ${{ github.event.client_payload.version }}
 | 
			
		||||
          sed -i.bak -E "s|'xrpl/[a-zA-Z0-9\\.\\-]+'|'xrpl/${{ github.event.client_payload.conan_ref }}'|g" conanfile.py
 | 
			
		||||
          rm -f conanfile.py.bak
 | 
			
		||||
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: ./.github/actions/prepare_runner
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: true
 | 
			
		||||
      - name: Update conan lockfile
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          conan lock create . --profile:all ${{ env.CONAN_PROFILE }}
 | 
			
		||||
 | 
			
		||||
      - name: Setup conan
 | 
			
		||||
        uses: ./.github/actions/setup_conan
 | 
			
		||||
      - name: Run conan
 | 
			
		||||
        uses: ./.github/actions/conan
 | 
			
		||||
        with:
 | 
			
		||||
          conan_profile: ${{ env.CONAN_PROFILE }}
 | 
			
		||||
 | 
			
		||||
      - name: Run conan and cmake
 | 
			
		||||
        uses: ./.github/actions/generate
 | 
			
		||||
      - name: Run CMake
 | 
			
		||||
        uses: ./.github/actions/cmake
 | 
			
		||||
        with:
 | 
			
		||||
          conan_profile: ${{ env.CONAN_PROFILE }}
 | 
			
		||||
          conan_cache_hit: ${{ steps.restore_cache.outputs.conan_cache_hit }}
 | 
			
		||||
          build_type: Release
 | 
			
		||||
 | 
			
		||||
      - name: Build Clio
 | 
			
		||||
        uses: ./.github/actions/build_clio
 | 
			
		||||
        uses: ./.github/actions/build-clio
 | 
			
		||||
 | 
			
		||||
      - name: Strip tests
 | 
			
		||||
        run: strip build/clio_tests
 | 
			
		||||
 | 
			
		||||
      - name: Upload clio_tests
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          name: clio_tests_check_libxrpl
 | 
			
		||||
          path: build/clio_tests
 | 
			
		||||
@@ -61,12 +65,12 @@ jobs:
 | 
			
		||||
  run_tests:
 | 
			
		||||
    name: Run tests
 | 
			
		||||
    needs: build
 | 
			
		||||
    runs-on: [self-hosted, heavy]
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    container:
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:latest
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/download-artifact@v4
 | 
			
		||||
      - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          name: clio_tests_check_libxrpl
 | 
			
		||||
 | 
			
		||||
@@ -86,16 +90,17 @@ jobs:
 | 
			
		||||
      issues: write
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Create an issue
 | 
			
		||||
        uses: ./.github/actions/create_issue
 | 
			
		||||
        uses: ./.github/actions/create-issue
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ github.token }}
 | 
			
		||||
        with:
 | 
			
		||||
          labels: "compatibility,bug"
 | 
			
		||||
          title: "Proposed libXRPL check failed"
 | 
			
		||||
          body: >
 | 
			
		||||
            Clio build or tests failed against `libXRPL ${{ github.event.client_payload.version }}`.
 | 
			
		||||
            Clio build or tests failed against `libXRPL ${{ github.event.client_payload.conan_ref }}`.
 | 
			
		||||
 | 
			
		||||
            Workflow: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/
 | 
			
		||||
            PR: ${{ github.event.client_payload.pr_url }}
 | 
			
		||||
            Workflow run: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/
 | 
			
		||||
@@ -10,8 +10,17 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: ytanikin/pr-conventional-commits@8267db1bacc237419f9ed0228bb9d94e94271a1d # v1.4.1
 | 
			
		||||
      - uses: ytanikin/pr-conventional-commits@b72758283dcbee706975950e96bc4bf323a8d8c0 # 1.4.2
 | 
			
		||||
        with:
 | 
			
		||||
          task_types: '["build","feat","fix","docs","test","ci","style","refactor","perf","chore"]'
 | 
			
		||||
          add_label: false
 | 
			
		||||
          custom_labels: '{"build":"build", "feat":"enhancement", "fix":"bug", "docs":"documentation", "test":"testability", "ci":"ci", "style":"refactoring", "refactor":"refactoring", "perf":"performance", "chore":"tooling"}'
 | 
			
		||||
 | 
			
		||||
      - name: Check if message starts with upper-case letter
 | 
			
		||||
        env:
 | 
			
		||||
          PR_TITLE: ${{ github.event.pull_request.title }}
 | 
			
		||||
        run: |
 | 
			
		||||
          if [[ ! "${PR_TITLE}" =~ ^[a-z]+:\ [\[A-Z] ]]; then
 | 
			
		||||
            echo "Error: PR title must start with an upper-case letter."
 | 
			
		||||
            exit 1
 | 
			
		||||
          fi
 | 
			
		||||
							
								
								
									
										37
									
								
								.github/workflows/clang-tidy.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								.github/workflows/clang-tidy.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,6 +1,8 @@
 | 
			
		||||
name: Clang-tidy check
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches: [develop]
 | 
			
		||||
  schedule:
 | 
			
		||||
    - cron: "0 9 * * 1-5"
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
@@ -18,12 +20,14 @@ concurrency:
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
  CONAN_PROFILE: clang
 | 
			
		||||
  LLVM_TOOLS_VERSION: 20
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  clang_tidy:
 | 
			
		||||
    if: github.event_name != 'push' || contains(github.event.head_commit.message, 'clang-tidy auto fixes')
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    container:
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:latest
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
 | 
			
		||||
    permissions:
 | 
			
		||||
      contents: write
 | 
			
		||||
@@ -31,37 +35,34 @@ jobs:
 | 
			
		||||
      pull-requests: write
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: ./.github/actions/prepare_runner
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: true
 | 
			
		||||
 | 
			
		||||
      - name: Setup conan
 | 
			
		||||
        uses: ./.github/actions/setup_conan
 | 
			
		||||
        with:
 | 
			
		||||
          conan_profile: ${{ env.CONAN_PROFILE }}
 | 
			
		||||
 | 
			
		||||
      - name: Restore cache
 | 
			
		||||
        uses: ./.github/actions/restore_cache
 | 
			
		||||
        uses: ./.github/actions/restore-cache
 | 
			
		||||
        id: restore_cache
 | 
			
		||||
        with:
 | 
			
		||||
          conan_dir: ${{ env.CONAN_USER_HOME }}/.conan
 | 
			
		||||
          ccache_dir: ${{ env.CCACHE_DIR }}
 | 
			
		||||
          conan_profile: ${{ env.CONAN_PROFILE }}
 | 
			
		||||
          ccache_dir: ${{ env.CCACHE_DIR }}
 | 
			
		||||
 | 
			
		||||
      - name: Run conan and cmake
 | 
			
		||||
        uses: ./.github/actions/generate
 | 
			
		||||
      - name: Run conan
 | 
			
		||||
        uses: ./.github/actions/conan
 | 
			
		||||
        with:
 | 
			
		||||
          conan_profile: ${{ env.CONAN_PROFILE }}
 | 
			
		||||
 | 
			
		||||
      - name: Run CMake
 | 
			
		||||
        uses: ./.github/actions/cmake
 | 
			
		||||
        with:
 | 
			
		||||
          conan_profile: ${{ env.CONAN_PROFILE }}
 | 
			
		||||
          conan_cache_hit: ${{ steps.restore_cache.outputs.conan_cache_hit }}
 | 
			
		||||
          build_type: Release
 | 
			
		||||
 | 
			
		||||
      - name: Get number of threads
 | 
			
		||||
        uses: ./.github/actions/get_number_of_threads
 | 
			
		||||
        uses: ./.github/actions/get-threads-number
 | 
			
		||||
        id: number_of_threads
 | 
			
		||||
 | 
			
		||||
      - name: Run clang-tidy
 | 
			
		||||
@@ -69,7 +70,7 @@ jobs:
 | 
			
		||||
        shell: bash
 | 
			
		||||
        id: run_clang_tidy
 | 
			
		||||
        run: |
 | 
			
		||||
          run-clang-tidy-19 -p build -j "${{ steps.number_of_threads.outputs.threads_number }}" -fix -quiet 1>output.txt
 | 
			
		||||
          run-clang-tidy-${{ env.LLVM_TOOLS_VERSION }} -p build -j "${{ steps.number_of_threads.outputs.threads_number }}" -fix -quiet 1>output.txt
 | 
			
		||||
 | 
			
		||||
      - name: Fix local includes and clang-format style
 | 
			
		||||
        if: ${{ steps.run_clang_tidy.outcome != 'success' }}
 | 
			
		||||
@@ -89,7 +90,7 @@ jobs:
 | 
			
		||||
      - name: Create an issue
 | 
			
		||||
        if: ${{ steps.run_clang_tidy.outcome != 'success' && github.event_name != 'pull_request' }}
 | 
			
		||||
        id: create_issue
 | 
			
		||||
        uses: ./.github/actions/create_issue
 | 
			
		||||
        uses: ./.github/actions/create-issue
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ github.token }}
 | 
			
		||||
        with:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										30
									
								
								.github/workflows/clang-tidy_on_fix_merged.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								.github/workflows/clang-tidy_on_fix_merged.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,30 +0,0 @@
 | 
			
		||||
name: Restart clang-tidy workflow
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches: [develop]
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  restart_clang_tidy:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    permissions:
 | 
			
		||||
      actions: write
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - name: Check last commit matches clang-tidy auto fixes
 | 
			
		||||
        id: check
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          passed=$(if [[ "$(git log -1 --pretty=format:%s | grep 'style: clang-tidy auto fixes')" ]]; then echo 'true' ; else echo 'false' ; fi)
 | 
			
		||||
          echo "passed=\"$passed\"" >> $GITHUB_OUTPUT
 | 
			
		||||
 | 
			
		||||
      - name: Run clang-tidy workflow
 | 
			
		||||
        if: ${{ contains(steps.check.outputs.passed, 'true') }}
 | 
			
		||||
        shell: bash
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ github.token }}
 | 
			
		||||
          GH_REPO: ${{ github.repository }}
 | 
			
		||||
        run: gh workflow run clang-tidy.yml
 | 
			
		||||
							
								
								
									
										53
									
								
								.github/workflows/docs.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										53
									
								
								.github/workflows/docs.yml
									
									
									
									
										vendored
									
									
								
							@@ -5,48 +5,63 @@ on:
 | 
			
		||||
    branches: [develop]
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: read
 | 
			
		||||
  pages: write
 | 
			
		||||
  id-token: write
 | 
			
		||||
 | 
			
		||||
concurrency:
 | 
			
		||||
  # Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
 | 
			
		||||
  group: ${{ github.workflow }}-${{ github.ref }}
 | 
			
		||||
  cancel-in-progress: true
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  deploy:
 | 
			
		||||
    environment:
 | 
			
		||||
      name: github-pages
 | 
			
		||||
      url: ${{ steps.deployment.outputs.page_url }}
 | 
			
		||||
  build:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    continue-on-error: true
 | 
			
		||||
    container:
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:latest
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          lfs: true
 | 
			
		||||
 | 
			
		||||
      - name: Build docs
 | 
			
		||||
        run: |
 | 
			
		||||
          mkdir -p build_docs && cd build_docs
 | 
			
		||||
          cmake ../docs && cmake --build . --target docs
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: true
 | 
			
		||||
 | 
			
		||||
      - name: Create build directory
 | 
			
		||||
        run: mkdir build_docs
 | 
			
		||||
 | 
			
		||||
      - name: Configure CMake
 | 
			
		||||
        working-directory: build_docs
 | 
			
		||||
        run: cmake ../docs
 | 
			
		||||
 | 
			
		||||
      - name: Build
 | 
			
		||||
        working-directory: build_docs
 | 
			
		||||
        run: cmake --build . --target docs
 | 
			
		||||
 | 
			
		||||
      - name: Setup Pages
 | 
			
		||||
        uses: actions/configure-pages@v5
 | 
			
		||||
        uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Upload artifact
 | 
			
		||||
        uses: actions/upload-pages-artifact@v3
 | 
			
		||||
        uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          path: build_docs/html
 | 
			
		||||
          name: docs-develop
 | 
			
		||||
 | 
			
		||||
  deploy:
 | 
			
		||||
    needs: build
 | 
			
		||||
    permissions:
 | 
			
		||||
      pages: write
 | 
			
		||||
      id-token: write
 | 
			
		||||
 | 
			
		||||
    environment:
 | 
			
		||||
      name: github-pages
 | 
			
		||||
      url: ${{ steps.deployment.outputs.page_url }}
 | 
			
		||||
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Deploy to GitHub Pages
 | 
			
		||||
        id: deployment
 | 
			
		||||
        uses: actions/deploy-pages@v4
 | 
			
		||||
        uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5
 | 
			
		||||
        with:
 | 
			
		||||
          artifact_name: docs-develop
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										63
									
								
								.github/workflows/nightly.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								.github/workflows/nightly.yml
									
									
									
									
										vendored
									
									
								
							@@ -8,13 +8,15 @@ on:
 | 
			
		||||
    paths:
 | 
			
		||||
      - .github/workflows/nightly.yml
 | 
			
		||||
 | 
			
		||||
      - .github/workflows/release_impl.yml
 | 
			
		||||
      - .github/workflows/build_and_test.yml
 | 
			
		||||
      - .github/workflows/build_impl.yml
 | 
			
		||||
      - .github/workflows/build_clio_docker_image.yml
 | 
			
		||||
      - .github/workflows/reusable-release.yml
 | 
			
		||||
      - .github/workflows/reusable-build-test.yml
 | 
			
		||||
      - .github/workflows/reusable-build.yml
 | 
			
		||||
      - .github/workflows/reusable-test.yml
 | 
			
		||||
      - .github/workflows/build-clio-docker-image.yml
 | 
			
		||||
 | 
			
		||||
      - ".github/actions/**"
 | 
			
		||||
      - "!.github/actions/code_coverage/**"
 | 
			
		||||
      - "!.github/actions/code-coverage/**"
 | 
			
		||||
      - .github/scripts/prepare-release-artifacts.sh
 | 
			
		||||
 | 
			
		||||
concurrency:
 | 
			
		||||
  # Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
 | 
			
		||||
@@ -30,21 +32,26 @@ jobs:
 | 
			
		||||
      matrix:
 | 
			
		||||
        include:
 | 
			
		||||
          - os: macos15
 | 
			
		||||
            conan_profile: default_apple_clang
 | 
			
		||||
            conan_profile: apple-clang
 | 
			
		||||
            build_type: Release
 | 
			
		||||
            static: false
 | 
			
		||||
          - os: heavy
 | 
			
		||||
            conan_profile: gcc
 | 
			
		||||
            build_type: Release
 | 
			
		||||
            static: true
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:latest" }'
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
          - os: heavy
 | 
			
		||||
            conan_profile: gcc
 | 
			
		||||
            build_type: Debug
 | 
			
		||||
            static: true
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:latest" }'
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
          - os: heavy
 | 
			
		||||
            conan_profile: gcc.ubsan
 | 
			
		||||
            build_type: Release
 | 
			
		||||
            static: false
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
 | 
			
		||||
    uses: ./.github/workflows/build_and_test.yml
 | 
			
		||||
    uses: ./.github/workflows/reusable-build-test.yml
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: ${{ matrix.os }}
 | 
			
		||||
      container: ${{ matrix.container }}
 | 
			
		||||
@@ -54,7 +61,8 @@ jobs:
 | 
			
		||||
      run_unit_tests: true
 | 
			
		||||
      run_integration_tests: true
 | 
			
		||||
      upload_clio_server: true
 | 
			
		||||
      disable_cache: true
 | 
			
		||||
      download_ccache: false
 | 
			
		||||
      upload_ccache: false
 | 
			
		||||
 | 
			
		||||
  analyze_build_time:
 | 
			
		||||
    name: Analyze Build Time
 | 
			
		||||
@@ -63,42 +71,45 @@ jobs:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        include:
 | 
			
		||||
          # TODO: Enable when we have at least ubuntu 22.04
 | 
			
		||||
          # as ClangBuildAnalyzer requires relatively modern glibc
 | 
			
		||||
          #
 | 
			
		||||
          # - os: heavy
 | 
			
		||||
          #   conan_profile: clang
 | 
			
		||||
          #   container: '{ "image": "ghcr.io/xrplf/clio-ci:latest" }'
 | 
			
		||||
          #   static: true
 | 
			
		||||
          - os: heavy
 | 
			
		||||
            conan_profile: clang
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
            static: true
 | 
			
		||||
          - os: macos15
 | 
			
		||||
            conan_profile: default_apple_clang
 | 
			
		||||
            conan_profile: apple-clang
 | 
			
		||||
            container: ""
 | 
			
		||||
            static: false
 | 
			
		||||
    uses: ./.github/workflows/build_impl.yml
 | 
			
		||||
    uses: ./.github/workflows/reusable-build.yml
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: ${{ matrix.os }}
 | 
			
		||||
      container: ${{ matrix.container }}
 | 
			
		||||
      conan_profile: ${{ matrix.conan_profile }}
 | 
			
		||||
      build_type: Release
 | 
			
		||||
      disable_cache: true
 | 
			
		||||
      download_ccache: false
 | 
			
		||||
      upload_ccache: false
 | 
			
		||||
      code_coverage: false
 | 
			
		||||
      static: ${{ matrix.static }}
 | 
			
		||||
      upload_clio_server: false
 | 
			
		||||
      targets: all
 | 
			
		||||
      sanitizer: "false"
 | 
			
		||||
      analyze_build_time: true
 | 
			
		||||
 | 
			
		||||
  nightly_release:
 | 
			
		||||
    needs: build-and-test
 | 
			
		||||
    uses: ./.github/workflows/release_impl.yml
 | 
			
		||||
    uses: ./.github/workflows/reusable-release.yml
 | 
			
		||||
    with:
 | 
			
		||||
      overwrite_release: true
 | 
			
		||||
      prerelease: true
 | 
			
		||||
      title: "Clio development (nightly) build"
 | 
			
		||||
      version: nightly
 | 
			
		||||
      notes_header_file: nightly_notes.md
 | 
			
		||||
      header: >
 | 
			
		||||
        > **Note:** Please remember that this is a development release and it is not recommended for production use.
 | 
			
		||||
 | 
			
		||||
        Changelog (including previous releases): <https://github.com/XRPLF/clio/commits/nightly>
 | 
			
		||||
      generate_changelog: false
 | 
			
		||||
      draft: false
 | 
			
		||||
 | 
			
		||||
  build_and_publish_docker_image:
 | 
			
		||||
    uses: ./.github/workflows/build_clio_docker_image.yml
 | 
			
		||||
    uses: ./.github/workflows/build-clio-docker-image.yml
 | 
			
		||||
    needs: build-and-test
 | 
			
		||||
    secrets: inherit
 | 
			
		||||
    with:
 | 
			
		||||
@@ -119,10 +130,10 @@ jobs:
 | 
			
		||||
      issues: write
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Create an issue
 | 
			
		||||
        uses: ./.github/actions/create_issue
 | 
			
		||||
        uses: ./.github/actions/create-issue
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ github.token }}
 | 
			
		||||
        with:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								.github/workflows/nightly_notes.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.github/workflows/nightly_notes.md
									
									
									
									
										vendored
									
									
								
							@@ -1,7 +0,0 @@
 | 
			
		||||
# Release notes
 | 
			
		||||
 | 
			
		||||
> **Note:** Please remember that this is a development release and it is not recommended for production use.
 | 
			
		||||
 | 
			
		||||
Changelog (including previous releases): <https://github.com/XRPLF/clio/commits/nightly>
 | 
			
		||||
 | 
			
		||||
## SHA256 checksums
 | 
			
		||||
							
								
								
									
										41
									
								
								.github/workflows/pre-commit-autoupdate.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								.github/workflows/pre-commit-autoupdate.yml
									
									
									
									
										vendored
									
									
								
							@@ -4,36 +4,19 @@ on:
 | 
			
		||||
  # every first day of the month
 | 
			
		||||
  schedule:
 | 
			
		||||
    - cron: "0 0 1 * *"
 | 
			
		||||
  # on demand
 | 
			
		||||
  pull_request:
 | 
			
		||||
    branches: [release/*, develop]
 | 
			
		||||
    paths:
 | 
			
		||||
      - ".pre-commit-config.yaml"
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  auto-update:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    permissions:
 | 
			
		||||
      contents: write
 | 
			
		||||
      pull-requests: write
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - uses: actions/setup-python@v5
 | 
			
		||||
        with:
 | 
			
		||||
          python-version: 3.x
 | 
			
		||||
 | 
			
		||||
      - run: pip install pre-commit
 | 
			
		||||
      - run: pre-commit autoupdate --freeze
 | 
			
		||||
      - run: pre-commit run --all-files || true
 | 
			
		||||
 | 
			
		||||
      - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
 | 
			
		||||
        if: always()
 | 
			
		||||
        env:
 | 
			
		||||
          GH_REPO: ${{ github.repository }}
 | 
			
		||||
          GH_TOKEN: ${{ github.token }}
 | 
			
		||||
        with:
 | 
			
		||||
          branch: update/pre-commit-hooks
 | 
			
		||||
          title: Update pre-commit hooks
 | 
			
		||||
          commit-message: "style: update pre-commit hooks"
 | 
			
		||||
          body: Update versions of pre-commit hooks to latest version.
 | 
			
		||||
          reviewers: "godexsoft,kuznetsss,PeterChen13579,mathbunnyru"
 | 
			
		||||
    uses: XRPLF/actions/.github/workflows/pre-commit-autoupdate.yml@afbcbdafbe0ce5439492fb87eda6441371086386
 | 
			
		||||
    with:
 | 
			
		||||
      sign_commit: true
 | 
			
		||||
      committer: "Clio CI <skuznetsov@ripple.com>"
 | 
			
		||||
      reviewers: "godexsoft,kuznetsss,PeterChen13579,mathbunnyru"
 | 
			
		||||
    secrets:
 | 
			
		||||
      GPG_PRIVATE_KEY: ${{ secrets.ACTIONS_GPG_PRIVATE_KEY }}
 | 
			
		||||
      GPG_PASSPHRASE: ${{ secrets.ACTIONS_GPG_PASSPHRASE }}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										24
									
								
								.github/workflows/pre-commit.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								.github/workflows/pre-commit.yml
									
									
									
									
										vendored
									
									
								
							@@ -3,26 +3,12 @@ name: Run pre-commit hooks
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
  push:
 | 
			
		||||
    branches:
 | 
			
		||||
      - develop
 | 
			
		||||
    branches: [develop]
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  run-hooks:
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    container:
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout Repo ⚡️
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: ./.github/actions/prepare_runner
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: true
 | 
			
		||||
 | 
			
		||||
      - name: Run pre-commit ✅
 | 
			
		||||
        run: pre-commit run --all-files
 | 
			
		||||
    uses: XRPLF/actions/.github/workflows/pre-commit.yml@a8d7472b450eb53a1e5228f64552e5974457a21a
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: heavy
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-pre-commit:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										59
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
name: Create release
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    tags:
 | 
			
		||||
      - "*.*.*"
 | 
			
		||||
  pull_request:
 | 
			
		||||
    paths:
 | 
			
		||||
      - .github/workflows/release.yml
 | 
			
		||||
 | 
			
		||||
concurrency:
 | 
			
		||||
  # Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
 | 
			
		||||
  group: ${{ github.workflow }}-${{ github.ref }}
 | 
			
		||||
  cancel-in-progress: true
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  build-and-test:
 | 
			
		||||
    name: Build and Test
 | 
			
		||||
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        include:
 | 
			
		||||
          - os: macos15
 | 
			
		||||
            conan_profile: apple-clang
 | 
			
		||||
            build_type: Release
 | 
			
		||||
            static: false
 | 
			
		||||
          - os: heavy
 | 
			
		||||
            conan_profile: gcc
 | 
			
		||||
            build_type: Release
 | 
			
		||||
            static: true
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
 | 
			
		||||
    uses: ./.github/workflows/reusable-build-test.yml
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: ${{ matrix.os }}
 | 
			
		||||
      container: ${{ matrix.container }}
 | 
			
		||||
      conan_profile: ${{ matrix.conan_profile }}
 | 
			
		||||
      build_type: ${{ matrix.build_type }}
 | 
			
		||||
      static: ${{ matrix.static }}
 | 
			
		||||
      run_unit_tests: true
 | 
			
		||||
      run_integration_tests: true
 | 
			
		||||
      upload_clio_server: true
 | 
			
		||||
      download_ccache: false
 | 
			
		||||
      upload_ccache: false
 | 
			
		||||
      expected_version: ${{ github.event_name == 'push' && github.ref_name || '' }}
 | 
			
		||||
 | 
			
		||||
  release:
 | 
			
		||||
    needs: build-and-test
 | 
			
		||||
    uses: ./.github/workflows/reusable-release.yml
 | 
			
		||||
    with:
 | 
			
		||||
      overwrite_release: false
 | 
			
		||||
      prerelease: ${{ contains(github.ref_name, '-') }}
 | 
			
		||||
      title: "${{ github.ref_name }}"
 | 
			
		||||
      version: "${{ github.ref_name }}"
 | 
			
		||||
      header: >
 | 
			
		||||
        ${{ contains(github.ref_name, '-') && '> **Note:** Please remember that this is a release candidate and it is not recommended for production use.' || '' }}
 | 
			
		||||
      generate_changelog: ${{ !contains(github.ref_name, '-') }}
 | 
			
		||||
      draft: ${{ !contains(github.ref_name, '-') }}
 | 
			
		||||
							
								
								
									
										78
									
								
								.github/workflows/release_impl.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										78
									
								
								.github/workflows/release_impl.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,78 +0,0 @@
 | 
			
		||||
name: Make release
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  workflow_call:
 | 
			
		||||
    inputs:
 | 
			
		||||
      overwrite_release:
 | 
			
		||||
        description: "Overwrite the current release and tag"
 | 
			
		||||
        required: true
 | 
			
		||||
        type: boolean
 | 
			
		||||
 | 
			
		||||
      title:
 | 
			
		||||
        description: "Release title"
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
 | 
			
		||||
      version:
 | 
			
		||||
        description: "Release version"
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
 | 
			
		||||
      notes_header_file:
 | 
			
		||||
        description: "Release notes header file"
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  release:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    env:
 | 
			
		||||
      GH_REPO: ${{ github.repository }}
 | 
			
		||||
      GH_TOKEN: ${{ github.token }}
 | 
			
		||||
 | 
			
		||||
    permissions:
 | 
			
		||||
      contents: write
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - uses: actions/download-artifact@v4
 | 
			
		||||
        with:
 | 
			
		||||
          path: release_artifacts
 | 
			
		||||
          pattern: clio_server_*
 | 
			
		||||
 | 
			
		||||
      - name: Prepare files
 | 
			
		||||
        shell: bash
 | 
			
		||||
        working-directory: release_artifacts
 | 
			
		||||
        run: |
 | 
			
		||||
          cp ${{ github.workspace }}/.github/workflows/${{ inputs.notes_header_file }} "${RUNNER_TEMP}/release_notes.md"
 | 
			
		||||
          echo '' >> "${RUNNER_TEMP}/release_notes.md"
 | 
			
		||||
          echo '```' >> "${RUNNER_TEMP}/release_notes.md"
 | 
			
		||||
 | 
			
		||||
          for d in $(ls); do
 | 
			
		||||
            archive_name=$(ls $d)
 | 
			
		||||
            mv ${d}/${archive_name} ./
 | 
			
		||||
            rm -r $d
 | 
			
		||||
            sha256sum ./$archive_name > ./${archive_name}.sha256sum
 | 
			
		||||
            cat ./$archive_name.sha256sum >> "${RUNNER_TEMP}/release_notes.md"
 | 
			
		||||
          done
 | 
			
		||||
 | 
			
		||||
          echo '```' >> "${RUNNER_TEMP}/release_notes.md"
 | 
			
		||||
 | 
			
		||||
      - name: Remove current release and tag
 | 
			
		||||
        if: ${{ github.event_name != 'pull_request' && inputs.overwrite_release }}
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          gh release delete ${{ inputs.version }} --yes || true
 | 
			
		||||
          git push origin :${{ inputs.version }} || true
 | 
			
		||||
 | 
			
		||||
      - name: Publish release
 | 
			
		||||
        if: ${{ github.event_name != 'pull_request' }}
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          gh release create ${{ inputs.version }} \
 | 
			
		||||
            ${{ inputs.overwrite_release && '--prerelease' || '' }} \
 | 
			
		||||
            --title "${{ inputs.title }}" \
 | 
			
		||||
            --target $GITHUB_SHA \
 | 
			
		||||
            --notes-file "${RUNNER_TEMP}/release_notes.md" \
 | 
			
		||||
            ./release_artifacts/clio_server*
 | 
			
		||||
@@ -23,8 +23,14 @@ on:
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
 | 
			
		||||
      disable_cache:
 | 
			
		||||
        description: Whether ccache and conan cache should be disabled
 | 
			
		||||
      download_ccache:
 | 
			
		||||
        description: Whether to download ccache from the cache
 | 
			
		||||
        required: false
 | 
			
		||||
        type: boolean
 | 
			
		||||
        default: true
 | 
			
		||||
 | 
			
		||||
      upload_ccache:
 | 
			
		||||
        description: Whether to upload ccache to the cache
 | 
			
		||||
        required: false
 | 
			
		||||
        type: boolean
 | 
			
		||||
        default: false
 | 
			
		||||
@@ -57,31 +63,39 @@ on:
 | 
			
		||||
        type: string
 | 
			
		||||
        default: all
 | 
			
		||||
 | 
			
		||||
      sanitizer:
 | 
			
		||||
        description: Sanitizer to use
 | 
			
		||||
      expected_version:
 | 
			
		||||
        description: Expected version of the clio_server binary
 | 
			
		||||
        required: false
 | 
			
		||||
        type: string
 | 
			
		||||
        default: "false"
 | 
			
		||||
        default: ""
 | 
			
		||||
 | 
			
		||||
      package:
 | 
			
		||||
        description: Whether to generate Debian package
 | 
			
		||||
        required: false
 | 
			
		||||
        type: boolean
 | 
			
		||||
        default: false
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    uses: ./.github/workflows/build_impl.yml
 | 
			
		||||
    uses: ./.github/workflows/reusable-build.yml
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: ${{ inputs.runs_on }}
 | 
			
		||||
      container: ${{ inputs.container }}
 | 
			
		||||
      conan_profile: ${{ inputs.conan_profile }}
 | 
			
		||||
      build_type: ${{ inputs.build_type }}
 | 
			
		||||
      disable_cache: ${{ inputs.disable_cache }}
 | 
			
		||||
      download_ccache: ${{ inputs.download_ccache }}
 | 
			
		||||
      upload_ccache: ${{ inputs.upload_ccache }}
 | 
			
		||||
      code_coverage: false
 | 
			
		||||
      static: ${{ inputs.static }}
 | 
			
		||||
      upload_clio_server: ${{ inputs.upload_clio_server }}
 | 
			
		||||
      targets: ${{ inputs.targets }}
 | 
			
		||||
      sanitizer: ${{ inputs.sanitizer }}
 | 
			
		||||
      analyze_build_time: false
 | 
			
		||||
      expected_version: ${{ inputs.expected_version }}
 | 
			
		||||
      package: ${{ inputs.package }}
 | 
			
		||||
 | 
			
		||||
  test:
 | 
			
		||||
    needs: build
 | 
			
		||||
    uses: ./.github/workflows/test_impl.yml
 | 
			
		||||
    uses: ./.github/workflows/reusable-test.yml
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: ${{ inputs.runs_on }}
 | 
			
		||||
      container: ${{ inputs.container }}
 | 
			
		||||
@@ -89,4 +103,3 @@ jobs:
 | 
			
		||||
      build_type: ${{ inputs.build_type }}
 | 
			
		||||
      run_unit_tests: ${{ inputs.run_unit_tests }}
 | 
			
		||||
      run_integration_tests: ${{ inputs.run_integration_tests }}
 | 
			
		||||
      sanitizer: ${{ inputs.sanitizer }}
 | 
			
		||||
@@ -23,10 +23,17 @@ on:
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
 | 
			
		||||
      disable_cache:
 | 
			
		||||
        description: Whether ccache and conan cache should be disabled
 | 
			
		||||
      download_ccache:
 | 
			
		||||
        description: Whether to download ccache from the cache
 | 
			
		||||
        required: false
 | 
			
		||||
        type: boolean
 | 
			
		||||
        default: true
 | 
			
		||||
 | 
			
		||||
      upload_ccache:
 | 
			
		||||
        description: Whether to upload ccache to the cache
 | 
			
		||||
        required: false
 | 
			
		||||
        type: boolean
 | 
			
		||||
        default: false
 | 
			
		||||
 | 
			
		||||
      code_coverage:
 | 
			
		||||
        description: Whether to enable code coverage
 | 
			
		||||
@@ -48,69 +55,83 @@ on:
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
 | 
			
		||||
      sanitizer:
 | 
			
		||||
        description: Sanitizer to use
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
 | 
			
		||||
      analyze_build_time:
 | 
			
		||||
        description: Whether to enable build time analysis
 | 
			
		||||
        required: true
 | 
			
		||||
        type: boolean
 | 
			
		||||
 | 
			
		||||
      expected_version:
 | 
			
		||||
        description: Expected version of the clio_server binary
 | 
			
		||||
        required: false
 | 
			
		||||
        type: string
 | 
			
		||||
        default: ""
 | 
			
		||||
 | 
			
		||||
      package:
 | 
			
		||||
        description: Whether to generate Debian package
 | 
			
		||||
        required: false
 | 
			
		||||
        type: boolean
 | 
			
		||||
 | 
			
		||||
    secrets:
 | 
			
		||||
      CODECOV_TOKEN:
 | 
			
		||||
        required: false
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    name: Build ${{ inputs.container != '' && 'in container' || 'natively' }}
 | 
			
		||||
    name: Build
 | 
			
		||||
    runs-on: ${{ inputs.runs_on }}
 | 
			
		||||
    container: ${{ inputs.container != '' && fromJson(inputs.container) || null }}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Clean workdir
 | 
			
		||||
      - name: Cleanup workspace
 | 
			
		||||
        if: ${{ runner.os == 'macOS' }}
 | 
			
		||||
        uses: kuznetsss/workspace-cleanup@80b9863b45562c148927c3d53621ef354e5ae7ce # v1.0
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/cleanup-workspace@ea9970b7c211b18f4c8bcdb28c29f5711752029f
 | 
			
		||||
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
          # We need to fetch tags to have correct version in the release
 | 
			
		||||
          # The workaround is based on https://github.com/actions/checkout/issues/1467
 | 
			
		||||
          fetch-tags: true
 | 
			
		||||
          ref: ${{ github.ref }}
 | 
			
		||||
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: ./.github/actions/prepare_runner
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: ${{ inputs.disable_cache }}
 | 
			
		||||
          disable_ccache: ${{ !inputs.download_ccache }}
 | 
			
		||||
 | 
			
		||||
      - name: Setup conan
 | 
			
		||||
        uses: ./.github/actions/setup_conan
 | 
			
		||||
        with:
 | 
			
		||||
          conan_profile: ${{ inputs.conan_profile }}
 | 
			
		||||
      - name: Setup conan on macOS
 | 
			
		||||
        if: ${{ runner.os == 'macOS' }}
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: ./.github/scripts/conan/init.sh
 | 
			
		||||
 | 
			
		||||
      - name: Restore cache
 | 
			
		||||
        if: ${{ !inputs.disable_cache }}
 | 
			
		||||
        uses: ./.github/actions/restore_cache
 | 
			
		||||
        if: ${{ inputs.download_ccache }}
 | 
			
		||||
        uses: ./.github/actions/restore-cache
 | 
			
		||||
        id: restore_cache
 | 
			
		||||
        with:
 | 
			
		||||
          conan_dir: ${{ env.CONAN_USER_HOME }}/.conan
 | 
			
		||||
          conan_profile: ${{ inputs.conan_profile }}
 | 
			
		||||
          ccache_dir: ${{ env.CCACHE_DIR }}
 | 
			
		||||
          build_type: ${{ inputs.build_type }}
 | 
			
		||||
          code_coverage: ${{ inputs.code_coverage }}
 | 
			
		||||
 | 
			
		||||
      - name: Run conan and cmake
 | 
			
		||||
        uses: ./.github/actions/generate
 | 
			
		||||
      - name: Run conan
 | 
			
		||||
        uses: ./.github/actions/conan
 | 
			
		||||
        with:
 | 
			
		||||
          conan_profile: ${{ inputs.conan_profile }}
 | 
			
		||||
          build_type: ${{ inputs.build_type }}
 | 
			
		||||
 | 
			
		||||
      - name: Run CMake
 | 
			
		||||
        uses: ./.github/actions/cmake
 | 
			
		||||
        with:
 | 
			
		||||
          conan_profile: ${{ inputs.conan_profile }}
 | 
			
		||||
          conan_cache_hit: ${{ !inputs.disable_cache && steps.restore_cache.outputs.conan_cache_hit }}
 | 
			
		||||
          build_type: ${{ inputs.build_type }}
 | 
			
		||||
          code_coverage: ${{ inputs.code_coverage }}
 | 
			
		||||
          static: ${{ inputs.static }}
 | 
			
		||||
          sanitizer: ${{ inputs.sanitizer }}
 | 
			
		||||
          time_trace: ${{ inputs.analyze_build_time }}
 | 
			
		||||
          package: ${{ inputs.package }}
 | 
			
		||||
 | 
			
		||||
      - name: Build Clio
 | 
			
		||||
        uses: ./.github/actions/build_clio
 | 
			
		||||
        uses: ./.github/actions/build-clio
 | 
			
		||||
        with:
 | 
			
		||||
          targets: ${{ inputs.targets }}
 | 
			
		||||
 | 
			
		||||
@@ -124,13 +145,13 @@ jobs:
 | 
			
		||||
 | 
			
		||||
      - name: Upload build time analyze report
 | 
			
		||||
        if: ${{ inputs.analyze_build_time }}
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          name: build_time_report_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
 | 
			
		||||
          path: build_time_report.txt
 | 
			
		||||
 | 
			
		||||
      - name: Show ccache's statistics
 | 
			
		||||
        if: ${{ !inputs.disable_cache }}
 | 
			
		||||
        if: ${{ inputs.download_ccache }}
 | 
			
		||||
        shell: bash
 | 
			
		||||
        id: ccache_stats
 | 
			
		||||
        run: |
 | 
			
		||||
@@ -140,58 +161,76 @@ jobs:
 | 
			
		||||
          cat /tmp/ccache.stats
 | 
			
		||||
 | 
			
		||||
      - name: Strip unit_tests
 | 
			
		||||
        if: inputs.sanitizer == 'false' && !inputs.code_coverage && !inputs.analyze_build_time
 | 
			
		||||
        if: ${{ !endsWith(inputs.conan_profile, 'san') && !inputs.code_coverage && !inputs.analyze_build_time }}
 | 
			
		||||
        run: strip build/clio_tests
 | 
			
		||||
 | 
			
		||||
      - name: Strip integration_tests
 | 
			
		||||
        if: inputs.sanitizer == 'false' && !inputs.code_coverage && !inputs.analyze_build_time
 | 
			
		||||
        if: ${{ !endsWith(inputs.conan_profile, 'san') && !inputs.code_coverage && !inputs.analyze_build_time }}
 | 
			
		||||
        run: strip build/clio_integration_tests
 | 
			
		||||
 | 
			
		||||
      - name: Upload clio_server
 | 
			
		||||
        if: inputs.upload_clio_server && !inputs.code_coverage && !inputs.analyze_build_time
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        if: ${{ inputs.upload_clio_server && !inputs.code_coverage && !inputs.analyze_build_time }}
 | 
			
		||||
        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          name: clio_server_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
 | 
			
		||||
          path: build/clio_server
 | 
			
		||||
 | 
			
		||||
      - name: Upload clio_tests
 | 
			
		||||
        if: ${{ !inputs.code_coverage && !inputs.analyze_build_time }}
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        if: ${{ !inputs.code_coverage && !inputs.analyze_build_time && !inputs.package }}
 | 
			
		||||
        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          name: clio_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
 | 
			
		||||
          path: build/clio_tests
 | 
			
		||||
 | 
			
		||||
      - name: Upload clio_integration_tests
 | 
			
		||||
        if: ${{ !inputs.code_coverage && !inputs.analyze_build_time }}
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        if: ${{ !inputs.code_coverage && !inputs.analyze_build_time && !inputs.package }}
 | 
			
		||||
        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          name: clio_integration_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
 | 
			
		||||
          path: build/clio_integration_tests
 | 
			
		||||
 | 
			
		||||
      - name: Save cache
 | 
			
		||||
        if: ${{ !inputs.disable_cache && github.ref == 'refs/heads/develop' }}
 | 
			
		||||
        uses: ./.github/actions/save_cache
 | 
			
		||||
      - name: Upload Clio Linux package
 | 
			
		||||
        if: ${{ inputs.package }}
 | 
			
		||||
        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          conan_dir: ${{ env.CONAN_USER_HOME }}/.conan
 | 
			
		||||
          conan_hash: ${{ steps.restore_cache.outputs.conan_hash }}
 | 
			
		||||
          conan_cache_hit: ${{ steps.restore_cache.outputs.conan_cache_hit }}
 | 
			
		||||
          name: clio_deb_package_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
 | 
			
		||||
          path: build/*.deb
 | 
			
		||||
 | 
			
		||||
      - name: Save cache
 | 
			
		||||
        if: ${{ inputs.upload_ccache && github.ref == 'refs/heads/develop' }}
 | 
			
		||||
        uses: ./.github/actions/save-cache
 | 
			
		||||
        with:
 | 
			
		||||
          conan_profile: ${{ inputs.conan_profile }}
 | 
			
		||||
          ccache_dir: ${{ env.CCACHE_DIR }}
 | 
			
		||||
          ccache_cache_hit: ${{ steps.restore_cache.outputs.ccache_cache_hit }}
 | 
			
		||||
          ccache_cache_miss_rate: ${{ steps.ccache_stats.outputs.miss_rate }}
 | 
			
		||||
          build_type: ${{ inputs.build_type }}
 | 
			
		||||
          code_coverage: ${{ inputs.code_coverage }}
 | 
			
		||||
          conan_profile: ${{ inputs.conan_profile }}
 | 
			
		||||
 | 
			
		||||
          ccache_cache_hit: ${{ steps.restore_cache.outputs.ccache_cache_hit }}
 | 
			
		||||
          ccache_cache_miss_rate: ${{ steps.ccache_stats.outputs.miss_rate }}
 | 
			
		||||
 | 
			
		||||
      # This is run as part of the build job, because it requires the following:
 | 
			
		||||
      # - source code
 | 
			
		||||
      # - generated source code (Build.cpp)
 | 
			
		||||
      # - conan packages
 | 
			
		||||
      # - .gcno files in build directory
 | 
			
		||||
      #
 | 
			
		||||
      # It's all available in the build job, but not in the test job
 | 
			
		||||
      - name: Run code coverage
 | 
			
		||||
        if: ${{ inputs.code_coverage }}
 | 
			
		||||
        uses: ./.github/actions/code_coverage
 | 
			
		||||
        uses: ./.github/actions/code-coverage
 | 
			
		||||
 | 
			
		||||
      - name: Verify expected version
 | 
			
		||||
        if: ${{ inputs.expected_version != '' }}
 | 
			
		||||
        shell: bash
 | 
			
		||||
        env:
 | 
			
		||||
          INPUT_EXPECTED_VERSION: ${{ inputs.expected_version }}
 | 
			
		||||
        run: |
 | 
			
		||||
          set -e
 | 
			
		||||
          EXPECTED_VERSION="clio-${INPUT_EXPECTED_VERSION}"
 | 
			
		||||
          actual_version=$(./build/clio_server --version)
 | 
			
		||||
          if [[ "$actual_version" != "$EXPECTED_VERSION" ]]; then
 | 
			
		||||
            echo "Expected version '${EXPECTED_VERSION}', but got '${actual_version}'"
 | 
			
		||||
            exit 1
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
  # `codecov/codecov-action` will rerun `gcov` if it's available and build directory is present
 | 
			
		||||
  # To prevent this from happening, we run this action in a separate workflow
 | 
			
		||||
@@ -201,6 +240,6 @@ jobs:
 | 
			
		||||
    if: ${{ inputs.code_coverage }}
 | 
			
		||||
    name: Codecov
 | 
			
		||||
    needs: build
 | 
			
		||||
    uses: ./.github/workflows/upload_coverage_report.yml
 | 
			
		||||
    uses: ./.github/workflows/reusable-upload-coverage-report.yml
 | 
			
		||||
    secrets:
 | 
			
		||||
      CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
 | 
			
		||||
							
								
								
									
										121
									
								
								.github/workflows/reusable-release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								.github/workflows/reusable-release.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,121 @@
 | 
			
		||||
name: Make release
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  workflow_call:
 | 
			
		||||
    inputs:
 | 
			
		||||
      overwrite_release:
 | 
			
		||||
        description: "Overwrite the current release and tag"
 | 
			
		||||
        required: true
 | 
			
		||||
        type: boolean
 | 
			
		||||
 | 
			
		||||
      prerelease:
 | 
			
		||||
        description: "Create a prerelease"
 | 
			
		||||
        required: true
 | 
			
		||||
        type: boolean
 | 
			
		||||
 | 
			
		||||
      title:
 | 
			
		||||
        description: "Release title"
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
 | 
			
		||||
      version:
 | 
			
		||||
        description: "Release version"
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
 | 
			
		||||
      header:
 | 
			
		||||
        description: "Release notes header"
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
 | 
			
		||||
      generate_changelog:
 | 
			
		||||
        description: "Generate changelog"
 | 
			
		||||
        required: true
 | 
			
		||||
        type: boolean
 | 
			
		||||
 | 
			
		||||
      draft:
 | 
			
		||||
        description: "Create a draft release"
 | 
			
		||||
        required: true
 | 
			
		||||
        type: boolean
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  release:
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    container:
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
    env:
 | 
			
		||||
      GH_REPO: ${{ github.repository }}
 | 
			
		||||
      GH_TOKEN: ${{ github.token }}
 | 
			
		||||
 | 
			
		||||
    permissions:
 | 
			
		||||
      contents: write
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: true
 | 
			
		||||
 | 
			
		||||
      - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          path: release_artifacts
 | 
			
		||||
          pattern: clio_server_*
 | 
			
		||||
 | 
			
		||||
      - name: Create release notes
 | 
			
		||||
        shell: bash
 | 
			
		||||
        env:
 | 
			
		||||
          RELEASE_HEADER: ${{ inputs.header }}
 | 
			
		||||
        run: |
 | 
			
		||||
          echo "# Release notes" > "${RUNNER_TEMP}/release_notes.md"
 | 
			
		||||
          echo "" >> "${RUNNER_TEMP}/release_notes.md"
 | 
			
		||||
          printf '%s\n' "${RELEASE_HEADER}" >> "${RUNNER_TEMP}/release_notes.md"
 | 
			
		||||
 | 
			
		||||
      - name: Generate changelog
 | 
			
		||||
        shell: bash
 | 
			
		||||
        if: ${{ inputs.generate_changelog }}
 | 
			
		||||
        run: |
 | 
			
		||||
          LAST_TAG="$(gh release view --json tagName -q .tagName --repo XRPLF/clio)"
 | 
			
		||||
          LAST_TAG_COMMIT="$(git rev-parse $LAST_TAG)"
 | 
			
		||||
          BASE_COMMIT="$(git merge-base HEAD $LAST_TAG_COMMIT)"
 | 
			
		||||
          git-cliff "${BASE_COMMIT}..HEAD" --ignore-tags "nightly|-b|-rc"
 | 
			
		||||
          cat CHANGELOG.md >> "${RUNNER_TEMP}/release_notes.md"
 | 
			
		||||
 | 
			
		||||
      - name: Prepare release artifacts
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: .github/scripts/prepare-release-artifacts.sh release_artifacts
 | 
			
		||||
 | 
			
		||||
      - name: Upload release notes
 | 
			
		||||
        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          name: release_notes_${{ inputs.version }}
 | 
			
		||||
          path: "${RUNNER_TEMP}/release_notes.md"
 | 
			
		||||
 | 
			
		||||
      - name: Remove current release and tag
 | 
			
		||||
        if: ${{ github.event_name != 'pull_request' && inputs.overwrite_release }}
 | 
			
		||||
        shell: bash
 | 
			
		||||
        env:
 | 
			
		||||
          RELEASE_VERSION: ${{ inputs.version }}
 | 
			
		||||
        run: |
 | 
			
		||||
          gh release delete "${RELEASE_VERSION}" --yes || true
 | 
			
		||||
          git push origin :"${RELEASE_VERSION}" || true
 | 
			
		||||
 | 
			
		||||
      - name: Publish release
 | 
			
		||||
        if: ${{ github.event_name != 'pull_request' }}
 | 
			
		||||
        shell: bash
 | 
			
		||||
        env:
 | 
			
		||||
          RELEASE_VERSION: ${{ inputs.version }}
 | 
			
		||||
          PRERELEASE_OPTION: ${{ inputs.prerelease && '--prerelease' || '' }}
 | 
			
		||||
          RELEASE_TITLE: ${{ inputs.title }}
 | 
			
		||||
          DRAFT_OPTION: ${{ inputs.draft && '--draft' || '' }}
 | 
			
		||||
        run: |
 | 
			
		||||
          gh release create "${RELEASE_VERSION}" \
 | 
			
		||||
            ${PRERELEASE_OPTION} \
 | 
			
		||||
            --title "${RELEASE_TITLE}" \
 | 
			
		||||
            --target "${GITHUB_SHA}" \
 | 
			
		||||
            ${DRAFT_OPTION} \
 | 
			
		||||
            --notes-file "${RUNNER_TEMP}/release_notes.md" \
 | 
			
		||||
            ./release_artifacts/clio_server*
 | 
			
		||||
@@ -33,33 +33,28 @@ on:
 | 
			
		||||
        required: true
 | 
			
		||||
        type: boolean
 | 
			
		||||
 | 
			
		||||
      sanitizer:
 | 
			
		||||
        description: Sanitizer to use
 | 
			
		||||
        required: true
 | 
			
		||||
        type: string
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  unit_tests:
 | 
			
		||||
    name: Unit testing ${{ inputs.container != '' && 'in container' || 'natively' }}
 | 
			
		||||
    name: Unit testing
 | 
			
		||||
    runs-on: ${{ inputs.runs_on }}
 | 
			
		||||
    container: ${{ inputs.container != '' && fromJson(inputs.container) || null }}
 | 
			
		||||
 | 
			
		||||
    if: inputs.run_unit_tests
 | 
			
		||||
    if: ${{ inputs.run_unit_tests }}
 | 
			
		||||
 | 
			
		||||
    env:
 | 
			
		||||
      # TODO: remove when we have fixed all currently existing issues from sanitizers
 | 
			
		||||
      SANITIZER_IGNORE_ERRORS: ${{ inputs.sanitizer != 'false' && inputs.sanitizer != 'ubsan' }}
 | 
			
		||||
      # TODO: remove completely when we have fixed all currently existing issues with sanitizers
 | 
			
		||||
      SANITIZER_IGNORE_ERRORS: ${{ endsWith(inputs.conan_profile, '.tsan') || (inputs.conan_profile == 'gcc.asan' && inputs.build_type == 'Release') }}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Clean workdir
 | 
			
		||||
      - name: Cleanup workspace
 | 
			
		||||
        if: ${{ runner.os == 'macOS' }}
 | 
			
		||||
        uses: kuznetsss/workspace-cleanup@80b9863b45562c148927c3d53621ef354e5ae7ce # v1.0
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/cleanup-workspace@ea9970b7c211b18f4c8bcdb28c29f5711752029f
 | 
			
		||||
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
      - uses: actions/download-artifact@v4
 | 
			
		||||
      - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          name: clio_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
 | 
			
		||||
 | 
			
		||||
@@ -68,15 +63,15 @@ jobs:
 | 
			
		||||
        run: chmod +x ./clio_tests
 | 
			
		||||
 | 
			
		||||
      - name: Run clio_tests (regular)
 | 
			
		||||
        if: env.SANITIZER_IGNORE_ERRORS == 'false'
 | 
			
		||||
        if: ${{ env.SANITIZER_IGNORE_ERRORS == 'false' }}
 | 
			
		||||
        run: ./clio_tests
 | 
			
		||||
 | 
			
		||||
      - name: Run clio_tests (sanitizer errors ignored)
 | 
			
		||||
        if: env.SANITIZER_IGNORE_ERRORS == 'true'
 | 
			
		||||
        run: ./.github/scripts/execute-tests-under-sanitizer ./clio_tests
 | 
			
		||||
        if: ${{ env.SANITIZER_IGNORE_ERRORS == 'true' }}
 | 
			
		||||
        run: ./.github/scripts/execute-tests-under-sanitizer.sh ./clio_tests
 | 
			
		||||
 | 
			
		||||
      - name: Check for sanitizer report
 | 
			
		||||
        if: env.SANITIZER_IGNORE_ERRORS == 'true'
 | 
			
		||||
        if: ${{ env.SANITIZER_IGNORE_ERRORS == 'true' }}
 | 
			
		||||
        shell: bash
 | 
			
		||||
        id: check_report
 | 
			
		||||
        run: |
 | 
			
		||||
@@ -87,16 +82,16 @@ jobs:
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
      - name: Upload sanitizer report
 | 
			
		||||
        if: env.SANITIZER_IGNORE_ERRORS == 'true' && steps.check_report.outputs.found_report == 'true'
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        if: ${{ env.SANITIZER_IGNORE_ERRORS == 'true' && steps.check_report.outputs.found_report == 'true' }}
 | 
			
		||||
        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          name: ${{ inputs.conan_profile }}_report
 | 
			
		||||
          name: sanitizer_report_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
 | 
			
		||||
          path: .sanitizer-report/*
 | 
			
		||||
          include-hidden-files: true
 | 
			
		||||
 | 
			
		||||
      - name: Create an issue
 | 
			
		||||
        if: false && env.SANITIZER_IGNORE_ERRORS == 'true' && steps.check_report.outputs.found_report == 'true'
 | 
			
		||||
        uses: ./.github/actions/create_issue
 | 
			
		||||
        if: ${{ false && env.SANITIZER_IGNORE_ERRORS == 'true' && steps.check_report.outputs.found_report == 'true' }}
 | 
			
		||||
        uses: ./.github/actions/create-issue
 | 
			
		||||
        env:
 | 
			
		||||
          GH_TOKEN: ${{ github.token }}
 | 
			
		||||
        with:
 | 
			
		||||
@@ -109,11 +104,11 @@ jobs:
 | 
			
		||||
            Reports are available as artifacts.
 | 
			
		||||
 | 
			
		||||
  integration_tests:
 | 
			
		||||
    name: Integration testing ${{ inputs.container != '' && 'in container' || 'natively' }}
 | 
			
		||||
    name: Integration testing
 | 
			
		||||
    runs-on: ${{ inputs.runs_on }}
 | 
			
		||||
    container: ${{ inputs.container != '' && fromJson(inputs.container) || null }}
 | 
			
		||||
 | 
			
		||||
    if: inputs.run_integration_tests
 | 
			
		||||
    if: ${{ inputs.run_integration_tests }}
 | 
			
		||||
 | 
			
		||||
    services:
 | 
			
		||||
      scylladb:
 | 
			
		||||
@@ -125,9 +120,9 @@ jobs:
 | 
			
		||||
          --health-retries 5
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Clean workdir
 | 
			
		||||
      - name: Cleanup workspace
 | 
			
		||||
        if: ${{ runner.os == 'macOS' }}
 | 
			
		||||
        uses: kuznetsss/workspace-cleanup@80b9863b45562c148927c3d53621ef354e5ae7ce # v1.0
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/cleanup-workspace@ea9970b7c211b18f4c8bcdb28c29f5711752029f
 | 
			
		||||
 | 
			
		||||
      - name: Spin up scylladb
 | 
			
		||||
        if: ${{ runner.os == 'macOS' }}
 | 
			
		||||
@@ -149,7 +144,7 @@ jobs:
 | 
			
		||||
            sleep 5
 | 
			
		||||
          done
 | 
			
		||||
 | 
			
		||||
      - uses: actions/download-artifact@v4
 | 
			
		||||
      - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          name: clio_integration_tests_${{ runner.os }}_${{ inputs.build_type }}_${{ inputs.conan_profile }}
 | 
			
		||||
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
name: Upload report
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
  workflow_call:
 | 
			
		||||
    secrets:
 | 
			
		||||
      CODECOV_TOKEN:
 | 
			
		||||
@@ -13,19 +12,19 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
      - name: Download report artifact
 | 
			
		||||
        uses: actions/download-artifact@v4
 | 
			
		||||
        uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          name: coverage-report.xml
 | 
			
		||||
          path: build
 | 
			
		||||
 | 
			
		||||
      - name: Upload coverage report
 | 
			
		||||
        if: ${{ hashFiles('build/coverage_report.xml') != '' }}
 | 
			
		||||
        uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
 | 
			
		||||
        uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1
 | 
			
		||||
        with:
 | 
			
		||||
          files: build/coverage_report.xml
 | 
			
		||||
          fail_ci_if_error: true
 | 
			
		||||
							
								
								
									
										39
									
								
								.github/workflows/sanitizers.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								.github/workflows/sanitizers.yml
									
									
									
									
										vendored
									
									
								
							@@ -8,16 +8,18 @@ on:
 | 
			
		||||
    paths:
 | 
			
		||||
      - .github/workflows/sanitizers.yml
 | 
			
		||||
 | 
			
		||||
      - .github/workflows/build_and_test.yml
 | 
			
		||||
      - .github/workflows/build_impl.yml
 | 
			
		||||
      - .github/workflows/test_impl.yml
 | 
			
		||||
      - .github/workflows/reusable-build-test.yml
 | 
			
		||||
      - .github/workflows/reusable-build.yml
 | 
			
		||||
      - .github/workflows/reusable-test.yml
 | 
			
		||||
 | 
			
		||||
      - ".github/actions/**"
 | 
			
		||||
      - "!.github/actions/build_docker_image/**"
 | 
			
		||||
      - "!.github/actions/create_issue/**"
 | 
			
		||||
      - .github/scripts/execute-tests-under-sanitizer
 | 
			
		||||
      - "!.github/actions/build-docker-image/**"
 | 
			
		||||
      - "!.github/actions/create-issue/**"
 | 
			
		||||
      - .github/scripts/execute-tests-under-sanitizer.sh
 | 
			
		||||
 | 
			
		||||
      - CMakeLists.txt
 | 
			
		||||
      - conanfile.py
 | 
			
		||||
      - conan.lock
 | 
			
		||||
      - "cmake/**"
 | 
			
		||||
      # We don't run sanitizer on code change, because it takes too long
 | 
			
		||||
      # - "src/**"
 | 
			
		||||
@@ -35,24 +37,21 @@ jobs:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        include:
 | 
			
		||||
          - sanitizer: tsan
 | 
			
		||||
            compiler: gcc
 | 
			
		||||
          - sanitizer: asan
 | 
			
		||||
            compiler: gcc
 | 
			
		||||
          - sanitizer: ubsan
 | 
			
		||||
            compiler: gcc
 | 
			
		||||
        compiler: [gcc, clang]
 | 
			
		||||
        sanitizer_ext: [.asan, .tsan, .ubsan]
 | 
			
		||||
        build_type: [Release, Debug]
 | 
			
		||||
 | 
			
		||||
    uses: ./.github/workflows/build_and_test.yml
 | 
			
		||||
    uses: ./.github/workflows/reusable-build-test.yml
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: heavy
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-ci:latest" }'
 | 
			
		||||
      disable_cache: true
 | 
			
		||||
      conan_profile: ${{ matrix.compiler }}.${{ matrix.sanitizer }}
 | 
			
		||||
      build_type: Release
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
      download_ccache: false
 | 
			
		||||
      upload_ccache: false
 | 
			
		||||
      conan_profile: ${{ matrix.compiler }}${{ matrix.sanitizer_ext }}
 | 
			
		||||
      build_type: ${{ matrix.build_type }}
 | 
			
		||||
      static: false
 | 
			
		||||
      run_unit_tests: true
 | 
			
		||||
      # Currently, both gcc.tsan and clang.tsan unit tests hang
 | 
			
		||||
      run_unit_tests: ${{ matrix.sanitizer_ext != '.tsan' }}
 | 
			
		||||
      run_integration_tests: false
 | 
			
		||||
      upload_clio_server: false
 | 
			
		||||
      targets: clio_tests clio_integration_tests
 | 
			
		||||
      sanitizer: ${{ matrix.sanitizer }}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										360
									
								
								.github/workflows/update-docker-ci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										360
									
								
								.github/workflows/update-docker-ci.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,360 @@
 | 
			
		||||
name: Update CI docker image
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    paths:
 | 
			
		||||
      - .github/workflows/update-docker-ci.yml
 | 
			
		||||
 | 
			
		||||
      - ".github/actions/build-docker-image/**"
 | 
			
		||||
 | 
			
		||||
      - "docker/**"
 | 
			
		||||
      - "!docker/clio/**"
 | 
			
		||||
      - "!docker/develop/**"
 | 
			
		||||
  push:
 | 
			
		||||
    branches: [develop]
 | 
			
		||||
    paths:
 | 
			
		||||
      - .github/workflows/update-docker-ci.yml
 | 
			
		||||
 | 
			
		||||
      - ".github/actions/build-docker-image/**"
 | 
			
		||||
 | 
			
		||||
      - "docker/**"
 | 
			
		||||
      - "!docker/clio/**"
 | 
			
		||||
      - "!docker/develop/**"
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
concurrency:
 | 
			
		||||
  # Only matches runs for the current workflow - matches against branch & tags
 | 
			
		||||
  group: ${{ github.workflow }}-${{ github.ref }}
 | 
			
		||||
  # We want to execute all builds sequentially in develop
 | 
			
		||||
  cancel-in-progress: false
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
  CLANG_MAJOR_VERSION: 19
 | 
			
		||||
  GCC_MAJOR_VERSION: 15
 | 
			
		||||
  GCC_VERSION: 15.2.0
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  repo:
 | 
			
		||||
    name: Calculate repo name
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    outputs:
 | 
			
		||||
      GHCR_REPO: ${{ steps.set-ghcr-repo.outputs.GHCR_REPO }}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Set GHCR_REPO
 | 
			
		||||
        id: set-ghcr-repo
 | 
			
		||||
        run: |
 | 
			
		||||
          echo "GHCR_REPO=$(echo ghcr.io/${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> ${GITHUB_OUTPUT}
 | 
			
		||||
 | 
			
		||||
  gcc-amd64:
 | 
			
		||||
    name: Build and push GCC docker image (amd64)
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    needs: repo
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Get changed files
 | 
			
		||||
        id: changed-files
 | 
			
		||||
        uses: tj-actions/changed-files@24d32ffd492484c1d75e0c0b894501ddb9d30d62 # v47.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          files: "docker/compilers/gcc/**"
 | 
			
		||||
 | 
			
		||||
      - uses: ./.github/actions/build-docker-image
 | 
			
		||||
        if: ${{ steps.changed-files.outputs.any_changed == 'true' }}
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
          DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
 | 
			
		||||
          DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
 | 
			
		||||
        with:
 | 
			
		||||
          images: |
 | 
			
		||||
            ${{ needs.repo.outputs.GHCR_REPO }}/clio-gcc
 | 
			
		||||
            ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_gcc' || '' }}
 | 
			
		||||
          push_image: ${{ github.event_name != 'pull_request' }}
 | 
			
		||||
          directory: docker/compilers/gcc
 | 
			
		||||
          tags: |
 | 
			
		||||
            type=raw,value=amd64-latest
 | 
			
		||||
            type=raw,value=amd64-${{ env.GCC_MAJOR_VERSION }}
 | 
			
		||||
            type=raw,value=amd64-${{ env.GCC_VERSION }}
 | 
			
		||||
            type=raw,value=amd64-${{ github.sha }}
 | 
			
		||||
          platforms: linux/amd64
 | 
			
		||||
          build_args: |
 | 
			
		||||
            GCC_MAJOR_VERSION=${{ env.GCC_MAJOR_VERSION }}
 | 
			
		||||
            GCC_VERSION=${{ env.GCC_VERSION }}
 | 
			
		||||
          dockerhub_repo: ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_gcc' || '' }}
 | 
			
		||||
          dockerhub_description: GCC compiler for XRPLF/clio.
 | 
			
		||||
 | 
			
		||||
  gcc-arm64:
 | 
			
		||||
    name: Build and push GCC docker image (arm64)
 | 
			
		||||
    runs-on: heavy-arm64
 | 
			
		||||
    needs: repo
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Get changed files
 | 
			
		||||
        id: changed-files
 | 
			
		||||
        uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46.0.5
 | 
			
		||||
        with:
 | 
			
		||||
          files: "docker/compilers/gcc/**"
 | 
			
		||||
 | 
			
		||||
      - uses: ./.github/actions/build-docker-image
 | 
			
		||||
        if: ${{ steps.changed-files.outputs.any_changed == 'true' }}
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
          DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
 | 
			
		||||
          DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
 | 
			
		||||
        with:
 | 
			
		||||
          images: |
 | 
			
		||||
            ${{ needs.repo.outputs.GHCR_REPO }}/clio-gcc
 | 
			
		||||
            ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_gcc' || '' }}
 | 
			
		||||
          push_image: ${{ github.event_name != 'pull_request' }}
 | 
			
		||||
          directory: docker/compilers/gcc
 | 
			
		||||
          tags: |
 | 
			
		||||
            type=raw,value=arm64-latest
 | 
			
		||||
            type=raw,value=arm64-${{ env.GCC_MAJOR_VERSION }}
 | 
			
		||||
            type=raw,value=arm64-${{ env.GCC_VERSION }}
 | 
			
		||||
            type=raw,value=arm64-${{ github.sha }}
 | 
			
		||||
          platforms: linux/arm64
 | 
			
		||||
          build_args: |
 | 
			
		||||
            GCC_MAJOR_VERSION=${{ env.GCC_MAJOR_VERSION }}
 | 
			
		||||
            GCC_VERSION=${{ env.GCC_VERSION }}
 | 
			
		||||
          dockerhub_repo: ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_gcc' || '' }}
 | 
			
		||||
          dockerhub_description: GCC compiler for XRPLF/clio.
 | 
			
		||||
 | 
			
		||||
  gcc-merge:
 | 
			
		||||
    name: Merge and push multi-arch GCC docker image
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    needs: [repo, gcc-amd64, gcc-arm64]
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Get changed files
 | 
			
		||||
        id: changed-files
 | 
			
		||||
        uses: tj-actions/changed-files@24d32ffd492484c1d75e0c0b894501ddb9d30d62 # v47.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          files: "docker/compilers/gcc/**"
 | 
			
		||||
 | 
			
		||||
      - name: Set up Docker Buildx
 | 
			
		||||
        uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
 | 
			
		||||
 | 
			
		||||
      - name: Login to GitHub Container Registry
 | 
			
		||||
        if: ${{ github.event_name != 'pull_request' }}
 | 
			
		||||
        uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
 | 
			
		||||
        with:
 | 
			
		||||
          registry: ghcr.io
 | 
			
		||||
          username: ${{ github.repository_owner }}
 | 
			
		||||
          password: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
 | 
			
		||||
      - name: Login to DockerHub
 | 
			
		||||
        if: ${{ github.repository_owner == 'XRPLF' && github.event_name != 'pull_request' }}
 | 
			
		||||
        uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
 | 
			
		||||
        with:
 | 
			
		||||
          username: ${{ secrets.DOCKERHUB_USER }}
 | 
			
		||||
          password: ${{ secrets.DOCKERHUB_PW }}
 | 
			
		||||
 | 
			
		||||
      - name: Create and push multi-arch manifest
 | 
			
		||||
        if: ${{ github.event_name != 'pull_request' && steps.changed-files.outputs.any_changed == 'true' }}
 | 
			
		||||
        run: |
 | 
			
		||||
          push_image() {
 | 
			
		||||
            image=$1
 | 
			
		||||
 | 
			
		||||
            docker buildx imagetools create \
 | 
			
		||||
                -t $image:latest \
 | 
			
		||||
                -t $image:${{ env.GCC_MAJOR_VERSION }} \
 | 
			
		||||
                -t $image:${{ env.GCC_VERSION }} \
 | 
			
		||||
                -t $image:${{ github.sha }} \
 | 
			
		||||
                $image:arm64-latest \
 | 
			
		||||
                $image:amd64-latest
 | 
			
		||||
          }
 | 
			
		||||
          push_image ${{ needs.repo.outputs.GHCR_REPO }}/clio-gcc
 | 
			
		||||
          if [[ ${{ github.repository_owner }} == 'XRPLF' ]]; then
 | 
			
		||||
            push_image rippleci/clio_clang
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
  clang:
 | 
			
		||||
    name: Build and push Clang docker image
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    needs: repo
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Get changed files
 | 
			
		||||
        id: changed-files
 | 
			
		||||
        uses: tj-actions/changed-files@24d32ffd492484c1d75e0c0b894501ddb9d30d62 # v47.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          files: "docker/compilers/clang/**"
 | 
			
		||||
 | 
			
		||||
      - uses: ./.github/actions/build-docker-image
 | 
			
		||||
        if: ${{ steps.changed-files.outputs.any_changed == 'true' }}
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
          DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
 | 
			
		||||
          DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
 | 
			
		||||
        with:
 | 
			
		||||
          images: |
 | 
			
		||||
            ${{ needs.repo.outputs.GHCR_REPO }}/clio-clang
 | 
			
		||||
            ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_clang' || '' }}
 | 
			
		||||
          push_image: ${{ github.event_name != 'pull_request' }}
 | 
			
		||||
          directory: docker/compilers/clang
 | 
			
		||||
          tags: |
 | 
			
		||||
            type=raw,value=latest
 | 
			
		||||
            type=raw,value=${{ env.CLANG_MAJOR_VERSION }}
 | 
			
		||||
            type=raw,value=${{ github.sha }}
 | 
			
		||||
          platforms: linux/amd64,linux/arm64
 | 
			
		||||
          build_args: |
 | 
			
		||||
            CLANG_MAJOR_VERSION=${{ env.CLANG_MAJOR_VERSION }}
 | 
			
		||||
          dockerhub_repo: ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_clang' || '' }}
 | 
			
		||||
          dockerhub_description: Clang compiler for XRPLF/clio.
 | 
			
		||||
 | 
			
		||||
  tools-amd64:
 | 
			
		||||
    name: Build and push tools docker image (amd64)
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    needs: [repo, gcc-merge]
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Get changed files
 | 
			
		||||
        id: changed-files
 | 
			
		||||
        uses: tj-actions/changed-files@24d32ffd492484c1d75e0c0b894501ddb9d30d62 # v47.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          files: "docker/tools/**"
 | 
			
		||||
 | 
			
		||||
      - uses: ./.github/actions/build-docker-image
 | 
			
		||||
        if: ${{ steps.changed-files.outputs.any_changed == 'true' }}
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        with:
 | 
			
		||||
          images: |
 | 
			
		||||
            ${{ needs.repo.outputs.GHCR_REPO }}/clio-tools
 | 
			
		||||
          push_image: ${{ github.event_name != 'pull_request' }}
 | 
			
		||||
          directory: docker/tools
 | 
			
		||||
          tags: |
 | 
			
		||||
            type=raw,value=amd64-latest
 | 
			
		||||
            type=raw,value=amd64-${{ github.sha }}
 | 
			
		||||
          platforms: linux/amd64
 | 
			
		||||
          build_args: |
 | 
			
		||||
            GHCR_REPO=${{ needs.repo.outputs.GHCR_REPO }}
 | 
			
		||||
            GCC_VERSION=${{ env.GCC_VERSION }}
 | 
			
		||||
 | 
			
		||||
  tools-arm64:
 | 
			
		||||
    name: Build and push tools docker image (arm64)
 | 
			
		||||
    runs-on: heavy-arm64
 | 
			
		||||
    needs: [repo, gcc-merge]
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Get changed files
 | 
			
		||||
        id: changed-files
 | 
			
		||||
        uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c # v46.0.5
 | 
			
		||||
        with:
 | 
			
		||||
          files: "docker/tools/**"
 | 
			
		||||
 | 
			
		||||
      - uses: ./.github/actions/build-docker-image
 | 
			
		||||
        if: ${{ steps.changed-files.outputs.any_changed == 'true' }}
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        with:
 | 
			
		||||
          images: |
 | 
			
		||||
            ${{ needs.repo.outputs.GHCR_REPO }}/clio-tools
 | 
			
		||||
          push_image: ${{ github.event_name != 'pull_request' }}
 | 
			
		||||
          directory: docker/tools
 | 
			
		||||
          tags: |
 | 
			
		||||
            type=raw,value=arm64-latest
 | 
			
		||||
            type=raw,value=arm64-${{ github.sha }}
 | 
			
		||||
          platforms: linux/arm64
 | 
			
		||||
          build_args: |
 | 
			
		||||
            GHCR_REPO=${{ needs.repo.outputs.GHCR_REPO }}
 | 
			
		||||
            GCC_VERSION=${{ env.GCC_VERSION }}
 | 
			
		||||
 | 
			
		||||
  tools-merge:
 | 
			
		||||
    name: Merge and push multi-arch tools docker image
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    needs: [repo, tools-amd64, tools-arm64]
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Get changed files
 | 
			
		||||
        id: changed-files
 | 
			
		||||
        uses: tj-actions/changed-files@24d32ffd492484c1d75e0c0b894501ddb9d30d62 # v47.0.0
 | 
			
		||||
        with:
 | 
			
		||||
          files: "docker/tools/**"
 | 
			
		||||
 | 
			
		||||
      - name: Set up Docker Buildx
 | 
			
		||||
        uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
 | 
			
		||||
 | 
			
		||||
      - name: Login to GitHub Container Registry
 | 
			
		||||
        if: ${{ github.event_name != 'pull_request' }}
 | 
			
		||||
        uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
 | 
			
		||||
        with:
 | 
			
		||||
          registry: ghcr.io
 | 
			
		||||
          username: ${{ github.repository_owner }}
 | 
			
		||||
          password: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
 | 
			
		||||
      - name: Create and push multi-arch manifest
 | 
			
		||||
        if: ${{ github.event_name != 'pull_request' && steps.changed-files.outputs.any_changed == 'true' }}
 | 
			
		||||
        run: |
 | 
			
		||||
          image=${{ needs.repo.outputs.GHCR_REPO }}/clio-tools
 | 
			
		||||
          docker buildx imagetools create \
 | 
			
		||||
            -t $image:latest \
 | 
			
		||||
            -t $image:${{ github.sha }} \
 | 
			
		||||
            $image:arm64-latest \
 | 
			
		||||
            $image:amd64-latest
 | 
			
		||||
 | 
			
		||||
  pre-commit:
 | 
			
		||||
    name: Build and push pre-commit docker image
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    needs: [repo, tools-merge]
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
      - uses: ./.github/actions/build-docker-image
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        with:
 | 
			
		||||
          images: |
 | 
			
		||||
            ${{ needs.repo.outputs.GHCR_REPO }}/clio-pre-commit
 | 
			
		||||
          push_image: ${{ github.event_name != 'pull_request' }}
 | 
			
		||||
          directory: docker/pre-commit
 | 
			
		||||
          tags: |
 | 
			
		||||
            type=raw,value=latest
 | 
			
		||||
            type=raw,value=${{ github.sha }}
 | 
			
		||||
          platforms: linux/amd64,linux/arm64
 | 
			
		||||
          build_args: |
 | 
			
		||||
            GHCR_REPO=${{ needs.repo.outputs.GHCR_REPO }}
 | 
			
		||||
 | 
			
		||||
  ci:
 | 
			
		||||
    name: Build and push CI docker image
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    needs: [repo, gcc-merge, clang, tools-merge]
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
      - uses: ./.github/actions/build-docker-image
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
          DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
 | 
			
		||||
          DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
 | 
			
		||||
        with:
 | 
			
		||||
          images: |
 | 
			
		||||
            ${{ needs.repo.outputs.GHCR_REPO }}/clio-ci
 | 
			
		||||
            ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_ci' || '' }}
 | 
			
		||||
          push_image: ${{ github.event_name != 'pull_request' }}
 | 
			
		||||
          directory: docker/ci
 | 
			
		||||
          tags: |
 | 
			
		||||
            type=raw,value=latest
 | 
			
		||||
            type=raw,value=gcc_${{ env.GCC_MAJOR_VERSION }}_clang_${{ env.CLANG_MAJOR_VERSION }}
 | 
			
		||||
            type=raw,value=${{ github.sha }}
 | 
			
		||||
          platforms: linux/amd64,linux/arm64
 | 
			
		||||
          build_args: |
 | 
			
		||||
            GHCR_REPO=${{ needs.repo.outputs.GHCR_REPO }}
 | 
			
		||||
            CLANG_MAJOR_VERSION=${{ env.CLANG_MAJOR_VERSION }}
 | 
			
		||||
            GCC_MAJOR_VERSION=${{ env.GCC_MAJOR_VERSION }}
 | 
			
		||||
            GCC_VERSION=${{ env.GCC_VERSION }}
 | 
			
		||||
          dockerhub_repo: ${{ github.repository_owner == 'XRPLF' && 'rippleci/clio_ci' || '' }}
 | 
			
		||||
          dockerhub_description: CI image for XRPLF/clio.
 | 
			
		||||
							
								
								
									
										54
									
								
								.github/workflows/update_docker_ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										54
									
								
								.github/workflows/update_docker_ci.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,54 +0,0 @@
 | 
			
		||||
name: Update CI docker image
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
    paths:
 | 
			
		||||
      - .github/workflows/update_docker_ci.yml
 | 
			
		||||
 | 
			
		||||
      - ".github/actions/build_docker_image/**"
 | 
			
		||||
 | 
			
		||||
      - "docker/ci/**"
 | 
			
		||||
      - "docker/compilers/**"
 | 
			
		||||
  push:
 | 
			
		||||
    branches: [develop]
 | 
			
		||||
    paths:
 | 
			
		||||
      - .github/workflows/update_docker_ci.yml
 | 
			
		||||
 | 
			
		||||
      - ".github/actions/build_docker_image/**"
 | 
			
		||||
 | 
			
		||||
      # CI image must update when either its Dockerfile changes
 | 
			
		||||
      # or any compilers changed and were pushed by hand
 | 
			
		||||
      - "docker/ci/**"
 | 
			
		||||
      - "docker/compilers/**"
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
concurrency:
 | 
			
		||||
  # Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
 | 
			
		||||
  group: ${{ github.workflow }}-${{ github.ref }}
 | 
			
		||||
  cancel-in-progress: true
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  build_and_push:
 | 
			
		||||
    name: Build and push docker image
 | 
			
		||||
    runs-on: [self-hosted, heavy]
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: ./.github/actions/build_docker_image
 | 
			
		||||
        env:
 | 
			
		||||
          DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
 | 
			
		||||
          DOCKERHUB_PW: ${{ secrets.DOCKERHUB_PW }}
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        with:
 | 
			
		||||
          images: |
 | 
			
		||||
            rippleci/clio_ci
 | 
			
		||||
            ghcr.io/xrplf/clio-ci
 | 
			
		||||
          dockerhub_repo: rippleci/clio_ci
 | 
			
		||||
          push_image: ${{ github.event_name != 'pull_request' }}
 | 
			
		||||
          directory: docker/ci
 | 
			
		||||
          tags: |
 | 
			
		||||
            type=raw,value=latest
 | 
			
		||||
            type=raw,value=gcc_12_clang_16
 | 
			
		||||
            type=raw,value=${{ github.sha }}
 | 
			
		||||
          platforms: linux/amd64,linux/arm64
 | 
			
		||||
          description: CI image for XRPLF/clio.
 | 
			
		||||
							
								
								
									
										104
									
								
								.github/workflows/upload-conan-deps.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								.github/workflows/upload-conan-deps.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,104 @@
 | 
			
		||||
name: Upload Conan Dependencies
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  schedule:
 | 
			
		||||
    - cron: "0 9 * * 1-5"
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
    inputs:
 | 
			
		||||
      force_source_build:
 | 
			
		||||
        description: "Force source build of all dependencies"
 | 
			
		||||
        required: false
 | 
			
		||||
        default: false
 | 
			
		||||
        type: boolean
 | 
			
		||||
      force_upload:
 | 
			
		||||
        description: "Force upload of all dependencies"
 | 
			
		||||
        required: false
 | 
			
		||||
        default: false
 | 
			
		||||
        type: boolean
 | 
			
		||||
  pull_request:
 | 
			
		||||
    branches: [develop]
 | 
			
		||||
    paths:
 | 
			
		||||
      - .github/workflows/upload-conan-deps.yml
 | 
			
		||||
 | 
			
		||||
      - .github/actions/conan/action.yml
 | 
			
		||||
      - ".github/scripts/conan/**"
 | 
			
		||||
 | 
			
		||||
      - conanfile.py
 | 
			
		||||
      - conan.lock
 | 
			
		||||
  push:
 | 
			
		||||
    branches: [develop]
 | 
			
		||||
    paths:
 | 
			
		||||
      - .github/workflows/upload-conan-deps.yml
 | 
			
		||||
 | 
			
		||||
      - .github/actions/conan/action.yml
 | 
			
		||||
      - ".github/scripts/conan/**"
 | 
			
		||||
 | 
			
		||||
      - conanfile.py
 | 
			
		||||
      - conan.lock
 | 
			
		||||
 | 
			
		||||
concurrency:
 | 
			
		||||
  group: ${{ github.workflow }}-${{ github.ref }}
 | 
			
		||||
  cancel-in-progress: true
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  generate-matrix:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    outputs:
 | 
			
		||||
      matrix: ${{ steps.set-matrix.outputs.matrix }}
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Calculate conan matrix
 | 
			
		||||
        id: set-matrix
 | 
			
		||||
        run: .github/scripts/conan/generate_matrix.py >> "${GITHUB_OUTPUT}"
 | 
			
		||||
 | 
			
		||||
  upload-conan-deps:
 | 
			
		||||
    name: Build ${{ matrix.compiler }}${{ matrix.sanitizer_ext }} ${{ matrix.build_type }}
 | 
			
		||||
 | 
			
		||||
    needs: generate-matrix
 | 
			
		||||
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }}
 | 
			
		||||
      max-parallel: 10
 | 
			
		||||
 | 
			
		||||
    runs-on: ${{ matrix.os }}
 | 
			
		||||
    container: ${{ matrix.container != '' && fromJson(matrix.container) || null }}
 | 
			
		||||
 | 
			
		||||
    env:
 | 
			
		||||
      CONAN_PROFILE: ${{ matrix.compiler }}${{ matrix.sanitizer_ext }}
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: true
 | 
			
		||||
 | 
			
		||||
      - name: Setup conan on macOS
 | 
			
		||||
        if: ${{ runner.os == 'macOS' }}
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: ./.github/scripts/conan/init.sh
 | 
			
		||||
 | 
			
		||||
      - name: Show conan profile
 | 
			
		||||
        run: conan profile show --profile:all ${{ env.CONAN_PROFILE }}
 | 
			
		||||
 | 
			
		||||
      - name: Run conan
 | 
			
		||||
        uses: ./.github/actions/conan
 | 
			
		||||
        with:
 | 
			
		||||
          conan_profile: ${{ env.CONAN_PROFILE }}
 | 
			
		||||
          # We check that everything builds fine from source on scheduled runs
 | 
			
		||||
          # But we do build and upload packages with build=missing by default
 | 
			
		||||
          force_conan_source_build: ${{ github.event_name == 'schedule' || github.event.inputs.force_source_build == 'true' }}
 | 
			
		||||
          build_type: ${{ matrix.build_type }}
 | 
			
		||||
 | 
			
		||||
      - name: Login to Conan
 | 
			
		||||
        if: ${{ github.repository_owner == 'XRPLF' && github.event_name != 'pull_request' }}
 | 
			
		||||
        run: conan remote login -p ${{ secrets.CONAN_PASSWORD }} xrplf ${{ secrets.CONAN_USERNAME }}
 | 
			
		||||
 | 
			
		||||
      - name: Upload Conan packages
 | 
			
		||||
        if: ${{ github.repository_owner == 'XRPLF' && github.event_name != 'pull_request' && github.event_name != 'schedule' }}
 | 
			
		||||
        env:
 | 
			
		||||
          FORCE_OPTION: ${{ github.event.inputs.force_upload == 'true' && '--force' || '' }}
 | 
			
		||||
        run: conan upload "*" -r=xrplf --confirm ${FORCE_OPTION}
 | 
			
		||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -9,4 +9,3 @@
 | 
			
		||||
.sanitizer-report
 | 
			
		||||
CMakeUserPresets.json
 | 
			
		||||
config.json
 | 
			
		||||
src/util/build/Build.cpp
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,6 @@
 | 
			
		||||
---
 | 
			
		||||
ignored:
 | 
			
		||||
  - DL3003
 | 
			
		||||
  - DL3007
 | 
			
		||||
  - DL3008
 | 
			
		||||
  - DL3013
 | 
			
		||||
  - DL3015
 | 
			
		||||
  - DL3027
 | 
			
		||||
  - DL3047
 | 
			
		||||
 
 | 
			
		||||
@@ -11,40 +11,39 @@
 | 
			
		||||
#
 | 
			
		||||
# See https://pre-commit.com for more information
 | 
			
		||||
# See https://pre-commit.com/hooks.html for more hooks
 | 
			
		||||
exclude: ^(docs/doxygen-awesome-theme/|conan\.lock$)
 | 
			
		||||
 | 
			
		||||
repos:
 | 
			
		||||
  # `pre-commit sample-config` default hooks
 | 
			
		||||
  - repo: https://github.com/pre-commit/pre-commit-hooks
 | 
			
		||||
    rev: cef0300fd0fc4d2a87a85fa2093c6b283ea36f4b # frozen: v5.0.0
 | 
			
		||||
    rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # frozen: v6.0.0
 | 
			
		||||
    hooks:
 | 
			
		||||
      - id: check-added-large-files
 | 
			
		||||
      - id: check-executables-have-shebangs
 | 
			
		||||
      - id: check-shebang-scripts-are-executable
 | 
			
		||||
      - id: end-of-file-fixer
 | 
			
		||||
        exclude: ^docs/doxygen-awesome-theme/
 | 
			
		||||
      - id: trailing-whitespace
 | 
			
		||||
        exclude: ^docs/doxygen-awesome-theme/
 | 
			
		||||
 | 
			
		||||
  # Autoformat: YAML, JSON, Markdown, etc.
 | 
			
		||||
  - repo: https://github.com/rbubley/mirrors-prettier
 | 
			
		||||
    rev: 787fb9f542b140ba0b2aced38e6a3e68021647a3 # frozen: v3.5.3
 | 
			
		||||
    rev: 5ba47274f9b181bce26a5150a725577f3c336011 # frozen: v3.6.2
 | 
			
		||||
    hooks:
 | 
			
		||||
      - id: prettier
 | 
			
		||||
        exclude: ^docs/doxygen-awesome-theme/
 | 
			
		||||
 | 
			
		||||
  - repo: https://github.com/igorshubovych/markdownlint-cli
 | 
			
		||||
    rev: 586c3ea3f51230da42bab657c6a32e9e66c364f0 # frozen: v0.44.0
 | 
			
		||||
    rev: 192ad822316c3a22fb3d3cc8aa6eafa0b8488360 # frozen: v0.45.0
 | 
			
		||||
    hooks:
 | 
			
		||||
      - id: markdownlint-fix
 | 
			
		||||
        exclude: LICENSE.md
 | 
			
		||||
 | 
			
		||||
  - repo: https://github.com/hadolint/hadolint
 | 
			
		||||
    rev: c3dc18df7a501f02a560a2cc7ba3c69a85ca01d3 # frozen: v2.13.1-beta
 | 
			
		||||
    rev: 4e697ba704fd23b2409b947a319c19c3ee54d24f # frozen: v2.14.0
 | 
			
		||||
    hooks:
 | 
			
		||||
      - id: hadolint-docker
 | 
			
		||||
        # hadolint-docker is a special hook that runs hadolint in a Docker container
 | 
			
		||||
        # Docker is not installed in the environment where pre-commit is run
 | 
			
		||||
        stages: [manual]
 | 
			
		||||
        entry: hadolint/hadolint:v2.12.1-beta hadolint
 | 
			
		||||
        entry: hadolint/hadolint:v2.14.0 hadolint
 | 
			
		||||
 | 
			
		||||
  - repo: https://github.com/codespell-project/codespell
 | 
			
		||||
    rev: 63c8f8312b7559622c0d82815639671ae42132ac # frozen: v2.4.1
 | 
			
		||||
@@ -56,17 +55,32 @@ repos:
 | 
			
		||||
            --ignore-words=pre-commit-hooks/codespell_ignore.txt,
 | 
			
		||||
          ]
 | 
			
		||||
 | 
			
		||||
  # Running fix-local-includes before clang-format
 | 
			
		||||
  # to ensure that the include order is correct.
 | 
			
		||||
  # Running some C++ hooks before clang-format
 | 
			
		||||
  # to ensure that the style is consistent.
 | 
			
		||||
  - repo: local
 | 
			
		||||
    hooks:
 | 
			
		||||
      - id: json-in-cpp
 | 
			
		||||
        name: Fix JSON style in C++
 | 
			
		||||
        entry: pre-commit-hooks/json_in_cpp.py
 | 
			
		||||
        types: [c++]
 | 
			
		||||
        language: python
 | 
			
		||||
        exclude: |
 | 
			
		||||
          (?x)^(
 | 
			
		||||
            tests/unit/etl/SubscriptionSourceTests.cpp|
 | 
			
		||||
            tests/unit/web/ServerTests.cpp|
 | 
			
		||||
            tests/unit/web/impl/ErrorHandlingTests.cpp|
 | 
			
		||||
            tests/unit/web/ng/ServerTests.cpp|
 | 
			
		||||
            tests/unit/web/ng/impl/ErrorHandlingTests.cpp
 | 
			
		||||
          )$
 | 
			
		||||
 | 
			
		||||
      - id: fix-local-includes
 | 
			
		||||
        name: Fix Local Includes
 | 
			
		||||
        entry: pre-commit-hooks/fix-local-includes.sh
 | 
			
		||||
        types: [c++]
 | 
			
		||||
        language: script
 | 
			
		||||
 | 
			
		||||
  - repo: https://github.com/pre-commit/mirrors-clang-format
 | 
			
		||||
    rev: f9a52e87b6cdcb01b0a62b8611d9ba9f2dad0067 # frozen: v19.1.7
 | 
			
		||||
    rev: 719856d56a62953b8d2839fb9e851f25c3cfeef8 # frozen: v21.1.2
 | 
			
		||||
    hooks:
 | 
			
		||||
      - id: clang-format
 | 
			
		||||
        args: [--style=file]
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,5 @@
 | 
			
		||||
cmake_minimum_required(VERSION 3.20)
 | 
			
		||||
 | 
			
		||||
set(CMAKE_PROJECT_INCLUDE_BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ClioVersion.cmake)
 | 
			
		||||
 | 
			
		||||
project(clio VERSION ${CLIO_VERSION} HOMEPAGE_URL "https://github.com/XRPLF/clio"
 | 
			
		||||
        DESCRIPTION "An XRP Ledger API Server"
 | 
			
		||||
)
 | 
			
		||||
@@ -13,7 +11,7 @@ option(integration_tests "Build integration tests" FALSE)
 | 
			
		||||
option(benchmark "Build benchmarks" FALSE)
 | 
			
		||||
option(docs "Generate doxygen docs" FALSE)
 | 
			
		||||
option(coverage "Build test coverage report" FALSE)
 | 
			
		||||
option(packaging "Create distribution packages" FALSE)
 | 
			
		||||
option(package "Create distribution packages" FALSE)
 | 
			
		||||
option(lint "Run clang-tidy checks during compilation" FALSE)
 | 
			
		||||
option(static "Statically linked Clio" FALSE)
 | 
			
		||||
option(snapshot "Build snapshot tool" FALSE)
 | 
			
		||||
@@ -31,6 +29,7 @@ set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
 | 
			
		||||
include(Ccache)
 | 
			
		||||
include(CheckCXXCompilerFlag)
 | 
			
		||||
include(ClangTidy)
 | 
			
		||||
include(Linker)
 | 
			
		||||
 | 
			
		||||
add_library(clio_options INTERFACE)
 | 
			
		||||
target_compile_features(clio_options INTERFACE cxx_std_23) # Clio needs c++23 but deps can remain c++20 for now
 | 
			
		||||
@@ -40,11 +39,6 @@ if (verbose)
 | 
			
		||||
  set(CMAKE_VERBOSE_MAKEFILE TRUE)
 | 
			
		||||
endif ()
 | 
			
		||||
 | 
			
		||||
if (packaging)
 | 
			
		||||
  add_definitions(-DPKG=1)
 | 
			
		||||
  target_compile_definitions(clio_options INTERFACE PKG=1)
 | 
			
		||||
endif ()
 | 
			
		||||
 | 
			
		||||
# Clio tweaks and checks
 | 
			
		||||
include(CheckCompiler)
 | 
			
		||||
include(Settings)
 | 
			
		||||
@@ -58,6 +52,7 @@ include(deps/Threads)
 | 
			
		||||
include(deps/libfmt)
 | 
			
		||||
include(deps/cassandra)
 | 
			
		||||
include(deps/libbacktrace)
 | 
			
		||||
include(deps/spdlog)
 | 
			
		||||
 | 
			
		||||
add_subdirectory(src)
 | 
			
		||||
add_subdirectory(tests)
 | 
			
		||||
@@ -69,15 +64,17 @@ endif ()
 | 
			
		||||
# Enable selected sanitizer if enabled via `san`
 | 
			
		||||
if (san)
 | 
			
		||||
  set(SUPPORTED_SANITIZERS "address" "thread" "memory" "undefined")
 | 
			
		||||
  list(FIND SUPPORTED_SANITIZERS "${san}" INDEX)
 | 
			
		||||
  if (INDEX EQUAL -1)
 | 
			
		||||
  if (NOT san IN_LIST SUPPORTED_SANITIZERS)
 | 
			
		||||
    message(FATAL_ERROR "Error: Unsupported sanitizer '${san}'. Supported values are: ${SUPPORTED_SANITIZERS}.")
 | 
			
		||||
  endif ()
 | 
			
		||||
 | 
			
		||||
  target_compile_options(
 | 
			
		||||
    clio_options INTERFACE # Sanitizers recommend minimum of -O1 for reasonable performance
 | 
			
		||||
                           $<$<CONFIG:Debug>:-O1> ${SAN_FLAG} -fno-omit-frame-pointer
 | 
			
		||||
  )
 | 
			
		||||
  # Sanitizers recommend minimum of -O1 for reasonable performance so we enable it for debug builds
 | 
			
		||||
  set(SAN_OPTIMIZATION_FLAG "")
 | 
			
		||||
  if (CMAKE_BUILD_TYPE STREQUAL "Debug")
 | 
			
		||||
    set(SAN_OPTIMIZATION_FLAG -O1)
 | 
			
		||||
  endif ()
 | 
			
		||||
  target_compile_options(clio_options INTERFACE ${SAN_OPTIMIZATION_FLAG} ${SAN_FLAG} -fno-omit-frame-pointer)
 | 
			
		||||
 | 
			
		||||
  target_compile_definitions(
 | 
			
		||||
    clio_options INTERFACE $<$<STREQUAL:${san},address>:SANITIZER=ASAN> $<$<STREQUAL:${san},thread>:SANITIZER=TSAN>
 | 
			
		||||
                           $<$<STREQUAL:${san},memory>:SANITIZER=MSAN> $<$<STREQUAL:${san},undefined>:SANITIZER=UBSAN>
 | 
			
		||||
@@ -91,8 +88,8 @@ if (docs)
 | 
			
		||||
endif ()
 | 
			
		||||
 | 
			
		||||
include(install/install)
 | 
			
		||||
if (packaging)
 | 
			
		||||
  include(cmake/packaging.cmake) # This file exists only in build runner
 | 
			
		||||
if (package)
 | 
			
		||||
  include(ClioPackage)
 | 
			
		||||
endif ()
 | 
			
		||||
 | 
			
		||||
if (snapshot)
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,6 @@ Below are some useful docs to learn more about Clio.
 | 
			
		||||
 | 
			
		||||
- [How to configure Clio and rippled](./docs/configure-clio.md)
 | 
			
		||||
- [How to run Clio](./docs/run-clio.md)
 | 
			
		||||
- [Logging](./docs/logging.md)
 | 
			
		||||
- [Troubleshooting guide](./docs/trouble_shooting.md)
 | 
			
		||||
 | 
			
		||||
**General reference material:**
 | 
			
		||||
 
 | 
			
		||||
@@ -7,10 +7,12 @@ target_sources(
 | 
			
		||||
          Playground.cpp
 | 
			
		||||
          # ExecutionContext
 | 
			
		||||
          util/async/ExecutionContextBenchmarks.cpp
 | 
			
		||||
          # Logger
 | 
			
		||||
          util/log/LoggerBenchmark.cpp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
include(deps/gbench)
 | 
			
		||||
 | 
			
		||||
target_include_directories(clio_benchmark PRIVATE .)
 | 
			
		||||
target_link_libraries(clio_benchmark PUBLIC clio_etl benchmark::benchmark_main)
 | 
			
		||||
target_link_libraries(clio_benchmark PUBLIC clio_util benchmark::benchmark_main spdlog::spdlog)
 | 
			
		||||
set_target_properties(clio_benchmark PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
 | 
			
		||||
 
 | 
			
		||||
@@ -191,8 +191,9 @@ generateData()
 | 
			
		||||
    constexpr auto kTOTAL = 10'000;
 | 
			
		||||
    std::vector<uint64_t> data;
 | 
			
		||||
    data.reserve(kTOTAL);
 | 
			
		||||
    util::MTRandomGenerator randomGenerator;
 | 
			
		||||
    for (auto i = 0; i < kTOTAL; ++i)
 | 
			
		||||
        data.push_back(util::Random::uniform(1, 100'000'000));
 | 
			
		||||
        data.push_back(randomGenerator.uniform(1, 100'000'000));
 | 
			
		||||
 | 
			
		||||
    return data;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										149
									
								
								benchmarks/util/log/LoggerBenchmark.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								benchmarks/util/log/LoggerBenchmark.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,149 @@
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
/*
 | 
			
		||||
    This file is part of clio: https://github.com/XRPLF/clio
 | 
			
		||||
    Copyright (c) 2025, the clio developers.
 | 
			
		||||
 | 
			
		||||
    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.
 | 
			
		||||
*/
 | 
			
		||||
//==============================================================================
 | 
			
		||||
 | 
			
		||||
#include "util/config/ConfigDefinition.hpp"
 | 
			
		||||
#include "util/log/Logger.hpp"
 | 
			
		||||
#include "util/prometheus/Prometheus.hpp"
 | 
			
		||||
 | 
			
		||||
#include <benchmark/benchmark.h>
 | 
			
		||||
#include <fmt/format.h>
 | 
			
		||||
#include <spdlog/async.h>
 | 
			
		||||
#include <spdlog/async_logger.h>
 | 
			
		||||
#include <spdlog/spdlog.h>
 | 
			
		||||
 | 
			
		||||
#include <barrier>
 | 
			
		||||
#include <chrono>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
#include <filesystem>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <thread>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
using namespace util;
 | 
			
		||||
 | 
			
		||||
static constexpr auto kLOG_FORMAT = "%Y-%m-%d %H:%M:%S.%f %^%3!l:%n%$ - %v";
 | 
			
		||||
 | 
			
		||||
struct BenchmarkLoggingInitializer {
 | 
			
		||||
    [[nodiscard]] static std::shared_ptr<spdlog::sinks::sink>
 | 
			
		||||
    createFileSink(LogService::FileLoggingParams const& params)
 | 
			
		||||
    {
 | 
			
		||||
        return LogService::createFileSink(params, kLOG_FORMAT);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static Logger
 | 
			
		||||
    getLogger(std::shared_ptr<spdlog::logger> logger)
 | 
			
		||||
    {
 | 
			
		||||
        return Logger(std::move(logger));
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
namespace {
 | 
			
		||||
 | 
			
		||||
std::string
 | 
			
		||||
uniqueLogDir()
 | 
			
		||||
{
 | 
			
		||||
    auto const epochTime = std::chrono::high_resolution_clock::now().time_since_epoch();
 | 
			
		||||
    auto const tmpDir = std::filesystem::temp_directory_path();
 | 
			
		||||
    std::string const dirName =
 | 
			
		||||
        fmt::format("logs_{}", std::chrono::duration_cast<std::chrono::microseconds>(epochTime).count());
 | 
			
		||||
    return tmpDir / "clio_benchmark" / dirName;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // anonymous namespace
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
benchmarkConcurrentFileLogging(benchmark::State& state)
 | 
			
		||||
{
 | 
			
		||||
    auto const numThreads = static_cast<size_t>(state.range(0));
 | 
			
		||||
    auto const messagesPerThread = static_cast<size_t>(state.range(1));
 | 
			
		||||
 | 
			
		||||
    PrometheusService::init(config::getClioConfig());
 | 
			
		||||
 | 
			
		||||
    auto const logDir = uniqueLogDir();
 | 
			
		||||
    for (auto _ : state) {
 | 
			
		||||
        state.PauseTiming();
 | 
			
		||||
 | 
			
		||||
        std::filesystem::create_directories(logDir);
 | 
			
		||||
        static constexpr size_t kQUEUE_SIZE = 8192;
 | 
			
		||||
        static constexpr size_t kTHREAD_COUNT = 1;
 | 
			
		||||
        spdlog::init_thread_pool(kQUEUE_SIZE, kTHREAD_COUNT);
 | 
			
		||||
 | 
			
		||||
        auto fileSink = BenchmarkLoggingInitializer::createFileSink({
 | 
			
		||||
            .logDir = logDir,
 | 
			
		||||
            .rotationSizeMB = 5,
 | 
			
		||||
            .dirMaxFiles = 25,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        std::vector<std::thread> threads;
 | 
			
		||||
        threads.reserve(numThreads);
 | 
			
		||||
 | 
			
		||||
        std::chrono::high_resolution_clock::time_point start;
 | 
			
		||||
        std::barrier barrier(numThreads, [&state, &start]() {
 | 
			
		||||
            state.ResumeTiming();
 | 
			
		||||
            start = std::chrono::high_resolution_clock::now();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        for (size_t threadNum = 0; threadNum < numThreads; ++threadNum) {
 | 
			
		||||
            threads.emplace_back([threadNum, messagesPerThread, fileSink, &barrier]() {
 | 
			
		||||
                std::string const channel = fmt::format("Thread_{}", threadNum);
 | 
			
		||||
                auto logger = std::make_shared<spdlog::async_logger>(
 | 
			
		||||
                    channel, fileSink, spdlog::thread_pool(), spdlog::async_overflow_policy::block
 | 
			
		||||
                );
 | 
			
		||||
                spdlog::register_logger(logger);
 | 
			
		||||
                Logger const threadLogger = BenchmarkLoggingInitializer::getLogger(std::move(logger));
 | 
			
		||||
 | 
			
		||||
                barrier.arrive_and_wait();
 | 
			
		||||
 | 
			
		||||
                for (size_t messageNum = 0; messageNum < messagesPerThread; ++messageNum) {
 | 
			
		||||
                    LOG(threadLogger.info()) << "Test log message #" << messageNum;
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (auto& thread : threads) {
 | 
			
		||||
            thread.join();
 | 
			
		||||
        }
 | 
			
		||||
        spdlog::shutdown();
 | 
			
		||||
 | 
			
		||||
        auto const end = std::chrono::high_resolution_clock::now();
 | 
			
		||||
        state.SetIterationTime(std::chrono::duration_cast<std::chrono::duration<double>>(end - start).count());
 | 
			
		||||
 | 
			
		||||
        std::filesystem::remove_all(logDir);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    auto const totalMessages = numThreads * messagesPerThread;
 | 
			
		||||
    state.counters["TotalMessagesRate"] = benchmark::Counter(totalMessages, benchmark::Counter::kIsRate);
 | 
			
		||||
    state.counters["Threads"] = numThreads;
 | 
			
		||||
    state.counters["MessagesPerThread"] = messagesPerThread;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// One line of log message is around 110 bytes
 | 
			
		||||
// So, 100K messages is around 10.5MB
 | 
			
		||||
 | 
			
		||||
BENCHMARK(benchmarkConcurrentFileLogging)
 | 
			
		||||
    ->ArgsProduct({
 | 
			
		||||
        // Number of threads
 | 
			
		||||
        {1, 2, 4, 8},
 | 
			
		||||
        // Messages per thread
 | 
			
		||||
        {10'000, 100'000, 500'000, 1'000'000, 10'000'000},
 | 
			
		||||
    })
 | 
			
		||||
    ->UseManualTime()
 | 
			
		||||
    ->Unit(benchmark::kMillisecond);
 | 
			
		||||
							
								
								
									
										17
									
								
								cliff.toml
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								cliff.toml
									
									
									
									
									
								
							@@ -8,15 +8,24 @@
 | 
			
		||||
[changelog]
 | 
			
		||||
# template for the changelog header
 | 
			
		||||
header = """
 | 
			
		||||
# Changelog\n
 | 
			
		||||
All notable changes to this project will be documented in this file.\n
 | 
			
		||||
"""
 | 
			
		||||
# template for the changelog body
 | 
			
		||||
# https://keats.github.io/tera/docs/#introduction
 | 
			
		||||
 | 
			
		||||
body = """
 | 
			
		||||
{% if version %}\
 | 
			
		||||
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
 | 
			
		||||
  Version {{ version | trim_start_matches(pat="v") }} of Clio, an XRP Ledger API server optimized for HTTP and WebSocket API calls, is now available.
 | 
			
		||||
{% else %}\
 | 
			
		||||
  Clio, an XRP Ledger API server optimized for HTTP and WebSocket API calls, is under active development.
 | 
			
		||||
{% endif %}\
 | 
			
		||||
 | 
			
		||||
<!-- Please, remove one of the 2 following lines -->
 | 
			
		||||
This release adds new features and bug fixes.
 | 
			
		||||
This release adds bug fixes.
 | 
			
		||||
\
 | 
			
		||||
{% if version %}
 | 
			
		||||
    ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
 | 
			
		||||
{% else %}
 | 
			
		||||
    ## [unreleased]
 | 
			
		||||
{% endif %}\
 | 
			
		||||
{% for group, commits in commits | filter(attribute="merge_commit", value=false) | group_by(attribute="group") %}
 | 
			
		||||
@@ -24,7 +33,7 @@ body = """
 | 
			
		||||
    {% for commit in commits %}
 | 
			
		||||
        - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
 | 
			
		||||
            {% if commit.breaking %}[**breaking**] {% endif %}\
 | 
			
		||||
            {{ commit.message | upper_first }} {% if commit.remote.username %}by @{{ commit.remote.username }}{% endif %}\
 | 
			
		||||
            {{ commit.message | upper_first }}{% if commit.remote.username %} by @{{ commit.remote.username }}{% endif %}\
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
{% endfor %}\n
 | 
			
		||||
"""
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ if (lint)
 | 
			
		||||
    endif ()
 | 
			
		||||
    message(STATUS "Using clang-tidy from CLIO_CLANG_TIDY_BIN")
 | 
			
		||||
  else ()
 | 
			
		||||
    find_program(_CLANG_TIDY_BIN NAMES "clang-tidy-19" "clang-tidy" REQUIRED)
 | 
			
		||||
    find_program(_CLANG_TIDY_BIN NAMES "clang-tidy-20" "clang-tidy" REQUIRED)
 | 
			
		||||
  endif ()
 | 
			
		||||
 | 
			
		||||
  if (NOT _CLANG_TIDY_BIN)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								cmake/ClioPackage.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								cmake/ClioPackage.cmake
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
include("${CMAKE_CURRENT_LIST_DIR}/ClioVersion.cmake")
 | 
			
		||||
 | 
			
		||||
set(CPACK_PACKAGING_INSTALL_PREFIX "/opt/clio")
 | 
			
		||||
set(CPACK_PACKAGE_VERSION "${CLIO_VERSION}")
 | 
			
		||||
set(CPACK_STRIP_FILES TRUE)
 | 
			
		||||
 | 
			
		||||
include(pkg/deb)
 | 
			
		||||
include(CPack)
 | 
			
		||||
@@ -1,42 +1,43 @@
 | 
			
		||||
#[===================================================================[
 | 
			
		||||
   write version to source
 | 
			
		||||
#]===================================================================]
 | 
			
		||||
 | 
			
		||||
find_package(Git REQUIRED)
 | 
			
		||||
 | 
			
		||||
set(GIT_COMMAND rev-parse --short HEAD)
 | 
			
		||||
set(GIT_COMMAND describe --tags --exact-match)
 | 
			
		||||
execute_process(
 | 
			
		||||
  COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE REV
 | 
			
		||||
  OUTPUT_STRIP_TRAILING_WHITESPACE
 | 
			
		||||
  COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND}
 | 
			
		||||
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
 | 
			
		||||
  OUTPUT_VARIABLE TAG
 | 
			
		||||
  RESULT_VARIABLE RC
 | 
			
		||||
  ERROR_VARIABLE ERR
 | 
			
		||||
  OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
set(GIT_COMMAND branch --show-current)
 | 
			
		||||
execute_process(
 | 
			
		||||
  COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE BRANCH
 | 
			
		||||
  OUTPUT_STRIP_TRAILING_WHITESPACE
 | 
			
		||||
)
 | 
			
		||||
if (RC EQUAL 0)
 | 
			
		||||
  message(STATUS "Found tag '${TAG}' in git. Will use it as Clio version")
 | 
			
		||||
  set(CLIO_VERSION "${TAG}")
 | 
			
		||||
  set(DOC_CLIO_VERSION "${TAG}")
 | 
			
		||||
else ()
 | 
			
		||||
  message(STATUS "Error finding tag in git: ${ERR}")
 | 
			
		||||
  message(STATUS "Will use 'YYYYMMDDHMS-<branch>-<git-rev>' as Clio version")
 | 
			
		||||
 | 
			
		||||
if (BRANCH STREQUAL "")
 | 
			
		||||
  set(BRANCH "dev")
 | 
			
		||||
endif ()
 | 
			
		||||
 | 
			
		||||
if (NOT (BRANCH MATCHES master OR BRANCH MATCHES release/*)) # for develop and any other branch name
 | 
			
		||||
                                                             # YYYYMMDDHMS-<branch>-<git-rev>
 | 
			
		||||
  set(GIT_COMMAND show -s --date=format:%Y%m%d%H%M%S --format=%cd)
 | 
			
		||||
  execute_process(
 | 
			
		||||
    COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE DATE
 | 
			
		||||
    OUTPUT_STRIP_TRAILING_WHITESPACE
 | 
			
		||||
    COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE DATE
 | 
			
		||||
    OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND_ERROR_IS_FATAL ANY
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
  set(GIT_COMMAND branch --show-current)
 | 
			
		||||
  execute_process(
 | 
			
		||||
    COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE BRANCH
 | 
			
		||||
    OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND_ERROR_IS_FATAL ANY
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
  set(GIT_COMMAND rev-parse --short HEAD)
 | 
			
		||||
  execute_process(
 | 
			
		||||
    COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE REV
 | 
			
		||||
    OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND_ERROR_IS_FATAL ANY
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
  set(CLIO_VERSION "${DATE}-${BRANCH}-${REV}")
 | 
			
		||||
  set(DOC_CLIO_VERSION "develop")
 | 
			
		||||
else ()
 | 
			
		||||
  set(GIT_COMMAND describe --tags)
 | 
			
		||||
  execute_process(
 | 
			
		||||
    COMMAND ${GIT_EXECUTABLE} ${GIT_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE CLIO_TAG_VERSION
 | 
			
		||||
    OUTPUT_STRIP_TRAILING_WHITESPACE
 | 
			
		||||
  )
 | 
			
		||||
  set(CLIO_VERSION "${CLIO_TAG_VERSION}")
 | 
			
		||||
  set(DOC_CLIO_VERSION "${CLIO_TAG_VERSION}")
 | 
			
		||||
endif ()
 | 
			
		||||
 | 
			
		||||
if (CMAKE_BUILD_TYPE MATCHES Debug)
 | 
			
		||||
@@ -44,5 +45,3 @@ if (CMAKE_BUILD_TYPE MATCHES Debug)
 | 
			
		||||
endif ()
 | 
			
		||||
 | 
			
		||||
message(STATUS "Build version: ${CLIO_VERSION}")
 | 
			
		||||
 | 
			
		||||
configure_file(${CMAKE_CURRENT_LIST_DIR}/Build.cpp.in ${CMAKE_CURRENT_LIST_DIR}/../src/util/build/Build.cpp)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								cmake/Linker.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								cmake/Linker.cmake
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
if (DEFINED CMAKE_LINKER_TYPE)
 | 
			
		||||
  message(STATUS "Custom linker is already set: ${CMAKE_LINKER_TYPE}")
 | 
			
		||||
  return()
 | 
			
		||||
endif ()
 | 
			
		||||
 | 
			
		||||
find_program(MOLD_PATH mold)
 | 
			
		||||
 | 
			
		||||
if (MOLD_PATH AND CMAKE_SYSTEM_NAME STREQUAL "Linux")
 | 
			
		||||
  message(STATUS "Using Mold linker: ${MOLD_PATH}")
 | 
			
		||||
  set(CMAKE_LINKER_TYPE MOLD)
 | 
			
		||||
endif ()
 | 
			
		||||
@@ -1,21 +1,22 @@
 | 
			
		||||
set(COMPILER_FLAGS
 | 
			
		||||
    -pedantic
 | 
			
		||||
    -Wall
 | 
			
		||||
    -Wcast-align
 | 
			
		||||
    -Wdouble-promotion
 | 
			
		||||
    -Wextra
 | 
			
		||||
    -Werror
 | 
			
		||||
    -Wextra
 | 
			
		||||
    -Wformat=2
 | 
			
		||||
    -Wimplicit-fallthrough
 | 
			
		||||
    -Wmisleading-indentation
 | 
			
		||||
    -Wno-narrowing
 | 
			
		||||
    -Wno-deprecated-declarations
 | 
			
		||||
    -Wno-dangling-else
 | 
			
		||||
    -Wno-deprecated-declarations
 | 
			
		||||
    -Wno-narrowing
 | 
			
		||||
    -Wno-unused-but-set-variable
 | 
			
		||||
    -Wnon-virtual-dtor
 | 
			
		||||
    -Wnull-dereference
 | 
			
		||||
    -Wold-style-cast
 | 
			
		||||
    -pedantic
 | 
			
		||||
    -Wpedantic
 | 
			
		||||
    -Wunreachable-code
 | 
			
		||||
    -Wunused
 | 
			
		||||
    # FIXME: The following bunch are needed for gcc12 atm.
 | 
			
		||||
    -Wno-missing-requires
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								cmake/deps/spdlog.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								cmake/deps/spdlog.cmake
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
find_package(spdlog REQUIRED)
 | 
			
		||||
 | 
			
		||||
if (NOT TARGET spdlog::spdlog)
 | 
			
		||||
  message(FATAL_ERROR "spdlog::spdlog target not found")
 | 
			
		||||
endif ()
 | 
			
		||||
@@ -1,17 +0,0 @@
 | 
			
		||||
[Unit]
 | 
			
		||||
Description=Clio XRPL API server
 | 
			
		||||
Documentation=https://github.com/XRPLF/clio.git
 | 
			
		||||
 | 
			
		||||
After=network-online.target
 | 
			
		||||
Wants=network-online.target
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=simple
 | 
			
		||||
ExecStart=@CLIO_INSTALL_DIR@/bin/clio_server @CLIO_INSTALL_DIR@/etc/config.json
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
User=clio
 | 
			
		||||
Group=clio
 | 
			
		||||
LimitNOFILE=65536
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
@@ -1,13 +1,13 @@
 | 
			
		||||
set(CLIO_INSTALL_DIR "/opt/clio")
 | 
			
		||||
set(CMAKE_INSTALL_PREFIX ${CLIO_INSTALL_DIR})
 | 
			
		||||
set(CMAKE_INSTALL_PREFIX "${CLIO_INSTALL_DIR}" CACHE PATH "Install prefix" FORCE)
 | 
			
		||||
 | 
			
		||||
install(TARGETS clio_server DESTINATION bin)
 | 
			
		||||
set(CPACK_PACKAGING_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
 | 
			
		||||
 | 
			
		||||
include(GNUInstallDirs)
 | 
			
		||||
 | 
			
		||||
install(TARGETS clio_server DESTINATION "${CMAKE_INSTALL_BINDIR}")
 | 
			
		||||
 | 
			
		||||
file(READ docs/examples/config/example-config.json config)
 | 
			
		||||
string(REGEX REPLACE "./clio_log" "/var/log/clio/" config "${config}")
 | 
			
		||||
file(WRITE ${CMAKE_BINARY_DIR}/install-config.json "${config}")
 | 
			
		||||
install(FILES ${CMAKE_BINARY_DIR}/install-config.json DESTINATION etc RENAME config.json)
 | 
			
		||||
 | 
			
		||||
configure_file("${CMAKE_SOURCE_DIR}/cmake/install/clio.service.in" "${CMAKE_BINARY_DIR}/clio.service")
 | 
			
		||||
 | 
			
		||||
install(FILES "${CMAKE_BINARY_DIR}/clio.service" DESTINATION /lib/systemd/system)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								cmake/pkg/deb.cmake
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								cmake/pkg/deb.cmake
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
set(CPACK_GENERATOR "DEB")
 | 
			
		||||
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/XRPLF/clio")
 | 
			
		||||
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Ripple Labs Inc. <support@ripple.com>")
 | 
			
		||||
 | 
			
		||||
set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT)
 | 
			
		||||
 | 
			
		||||
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
 | 
			
		||||
 | 
			
		||||
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA ${CMAKE_SOURCE_DIR}/cmake/pkg/postinst)
 | 
			
		||||
 | 
			
		||||
# We must replace "-" with "~" otherwise dpkg will sort "X.Y.Z-b1" as greater than "X.Y.Z"
 | 
			
		||||
string(REPLACE "-" "~" git "${CPACK_PACKAGE_VERSION}")
 | 
			
		||||
							
								
								
									
										46
									
								
								cmake/pkg/postinst
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										46
									
								
								cmake/pkg/postinst
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
USER_NAME=clio
 | 
			
		||||
GROUP_NAME="${USER_NAME}"
 | 
			
		||||
CLIO_EXECUTABLE="clio_server"
 | 
			
		||||
CLIO_PREFIX="/opt/clio"
 | 
			
		||||
CLIO_BIN="$CLIO_PREFIX/bin/${CLIO_EXECUTABLE}"
 | 
			
		||||
CLIO_CONFIG="$CLIO_PREFIX/etc/config.json"
 | 
			
		||||
 | 
			
		||||
case "$1" in
 | 
			
		||||
    configure)
 | 
			
		||||
        if ! id -u "$USER_NAME" >/dev/null 2>&1; then
 | 
			
		||||
            # Users who should not have a home directory should have their home directory set to /nonexistent
 | 
			
		||||
            # https://www.debian.org/doc/debian-policy/ch-opersys.html#non-existent-home-directories
 | 
			
		||||
            useradd \
 | 
			
		||||
                --system \
 | 
			
		||||
                --home-dir /nonexistent \
 | 
			
		||||
                --no-create-home \
 | 
			
		||||
                --shell /usr/sbin/nologin \
 | 
			
		||||
                --comment "system user for ${CLIO_EXECUTABLE}" \
 | 
			
		||||
                --user-group \
 | 
			
		||||
                ${USER_NAME}
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        install -d -o "$USER_NAME" -g "$GROUP_NAME" /var/log/clio
 | 
			
		||||
 | 
			
		||||
        if [ -f "$CLIO_CONFIG" ]; then
 | 
			
		||||
            chown "$USER_NAME:$GROUP_NAME" "$CLIO_CONFIG"
 | 
			
		||||
        fi
 | 
			
		||||
 | 
			
		||||
        chown -R "$USER_NAME:$GROUP_NAME" "$CLIO_PREFIX"
 | 
			
		||||
 | 
			
		||||
        ln -sf "$CLIO_BIN" "/usr/bin/${CLIO_EXECUTABLE}"
 | 
			
		||||
 | 
			
		||||
        ;;
 | 
			
		||||
    abort-upgrade|abort-remove|abort-deconfigure)
 | 
			
		||||
        ;;
 | 
			
		||||
    *)
 | 
			
		||||
        echo "postinst called with unknown argument \`$1'" >&2
 | 
			
		||||
        exit 1
 | 
			
		||||
        ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
							
								
								
									
										58
									
								
								conan.lock
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								conan.lock
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
{
 | 
			
		||||
    "version": "0.5",
 | 
			
		||||
    "requires": [
 | 
			
		||||
        "zlib/1.3.1#b8bc2603263cf7eccbd6e17e66b0ed76%1756234269.497",
 | 
			
		||||
        "xxhash/0.8.3#681d36a0a6111fc56e5e45ea182c19cc%1756234289.683",
 | 
			
		||||
        "xrpl/2.6.1#973af2bf9631f239941dd9f5a100bb84%1759275059.342",
 | 
			
		||||
        "sqlite3/3.49.1#8631739a4c9b93bd3d6b753bac548a63%1756234266.869",
 | 
			
		||||
        "spdlog/1.15.3#3ca0e9e6b83af4d0151e26541d140c86%1754401846.61",
 | 
			
		||||
        "soci/4.0.3#a9f8d773cd33e356b5879a4b0564f287%1756234262.318",
 | 
			
		||||
        "re2/20230301#dfd6e2bf050eb90ddd8729cfb4c844a4%1756234257.976",
 | 
			
		||||
        "rapidjson/cci.20220822#1b9d8c2256876a154172dc5cfbe447c6%1754325007.656",
 | 
			
		||||
        "protobuf/3.21.12#d927114e28de9f4691a6bbcdd9a529d1%1756234251.614",
 | 
			
		||||
        "openssl/1.1.1w#a8f0792d7c5121b954578a7149d23e03%1756223730.729",
 | 
			
		||||
        "nudb/2.0.9#c62cfd501e57055a7e0d8ee3d5e5427d%1756234237.107",
 | 
			
		||||
        "minizip/1.2.13#9e87d57804bd372d6d1e32b1871517a3%1754325004.374",
 | 
			
		||||
        "lz4/1.10.0#59fc63cac7f10fbe8e05c7e62c2f3504%1756234228.999",
 | 
			
		||||
        "libuv/1.46.0#dc28c1f653fa197f00db5b577a6f6011%1754325003.592",
 | 
			
		||||
        "libiconv/1.17#1e65319e945f2d31941a9d28cc13c058%1756223727.64",
 | 
			
		||||
        "libbacktrace/cci.20210118#a7691bfccd8caaf66309df196790a5a1%1756230911.03",
 | 
			
		||||
        "libarchive/3.8.1#5cf685686322e906cb42706ab7e099a8%1756234256.696",
 | 
			
		||||
        "http_parser/2.9.4#98d91690d6fd021e9e624218a85d9d97%1754325001.385",
 | 
			
		||||
        "gtest/1.14.0#f8f0757a574a8dd747d16af62d6eb1b7%1754325000.842",
 | 
			
		||||
        "grpc/1.50.1#02291451d1e17200293a409410d1c4e1%1756234248.958",
 | 
			
		||||
        "fmt/11.2.0#579bb2cdf4a7607621beea4eb4651e0f%1754324999.086",
 | 
			
		||||
        "doctest/2.4.11#a4211dfc329a16ba9f280f9574025659%1756234220.819",
 | 
			
		||||
        "date/3.0.4#f74bbba5a08fa388256688743136cb6f%1756234217.493",
 | 
			
		||||
        "cassandra-cpp-driver/2.17.0#e50919efac8418c26be6671fd702540a%1754324997.363",
 | 
			
		||||
        "c-ares/1.34.5#b78b91e7cfb1f11ce777a285bbf169c6%1756234217.915",
 | 
			
		||||
        "bzip2/1.0.8#00b4a4658791c1f06914e087f0e792f5%1756234261.716",
 | 
			
		||||
        "boost/1.83.0#5d975011d65b51abb2d2f6eb8386b368%1754325043.336",
 | 
			
		||||
        "benchmark/1.9.4#ce4403f7a24d3e1f907cd9da4b678be4%1754578869.672",
 | 
			
		||||
        "abseil/20230802.1#f0f91485b111dc9837a68972cb19ca7b%1756234220.907"
 | 
			
		||||
    ],
 | 
			
		||||
    "build_requires": [
 | 
			
		||||
        "zlib/1.3.1#b8bc2603263cf7eccbd6e17e66b0ed76%1756234269.497",
 | 
			
		||||
        "protobuf/3.21.12#d927114e28de9f4691a6bbcdd9a529d1%1756234251.614",
 | 
			
		||||
        "cmake/3.31.8#dde3bde00bb843687e55aea5afa0e220%1756234232.89",
 | 
			
		||||
        "b2/5.3.3#107c15377719889654eb9a162a673975%1756234226.28"
 | 
			
		||||
    ],
 | 
			
		||||
    "python_requires": [],
 | 
			
		||||
    "overrides": {
 | 
			
		||||
        "boost/1.83.0": [
 | 
			
		||||
            null,
 | 
			
		||||
            "boost/1.83.0#5d975011d65b51abb2d2f6eb8386b368"
 | 
			
		||||
        ],
 | 
			
		||||
        "protobuf/3.21.12": [
 | 
			
		||||
            null,
 | 
			
		||||
            "protobuf/3.21.12"
 | 
			
		||||
        ],
 | 
			
		||||
        "lz4/1.9.4": [
 | 
			
		||||
            "lz4/1.10.0"
 | 
			
		||||
        ],
 | 
			
		||||
        "sqlite3/3.44.2": [
 | 
			
		||||
            "sqlite3/3.49.1"
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    "config_requires": []
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										60
									
								
								conanfile.py
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								conanfile.py
									
									
									
									
									
								
							@@ -2,54 +2,29 @@ from conan import ConanFile
 | 
			
		||||
from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Clio(ConanFile):
 | 
			
		||||
class ClioConan(ConanFile):
 | 
			
		||||
    name = 'clio'
 | 
			
		||||
    license = 'ISC'
 | 
			
		||||
    author = 'Alex Kremer <akremer@ripple.com>, John Freeman <jfreeman@ripple.com>'
 | 
			
		||||
    author = 'Alex Kremer <akremer@ripple.com>, John Freeman <jfreeman@ripple.com>, Ayaz Salikhov <asalikhov@ripple.com>'
 | 
			
		||||
    url = 'https://github.com/xrplf/clio'
 | 
			
		||||
    description = 'Clio RPC server'
 | 
			
		||||
    settings = 'os', 'compiler', 'build_type', 'arch'
 | 
			
		||||
    options = {
 | 
			
		||||
        'static': [True, False],              # static linkage
 | 
			
		||||
        'fPIC': [True, False],                # unused?
 | 
			
		||||
        'verbose': [True, False],
 | 
			
		||||
        'tests': [True, False],               # build unit tests; create `clio_tests` binary
 | 
			
		||||
        'integration_tests': [True, False],   # build integration tests; create `clio_integration_tests` binary
 | 
			
		||||
        'benchmark': [True, False],           # build benchmarks; create `clio_benchmarks` binary
 | 
			
		||||
        'docs': [True, False],                # doxygen API docs; create custom target 'docs'
 | 
			
		||||
        'packaging': [True, False],           # create distribution packages
 | 
			
		||||
        'coverage': [True, False],            # build for test coverage report; create custom target `clio_tests-ccov`
 | 
			
		||||
        'lint': [True, False],                # run clang-tidy checks during compilation
 | 
			
		||||
        'snapshot': [True, False],            # build export/import snapshot tool
 | 
			
		||||
        'time_trace': [True, False]           # build using -ftime-trace to create compiler trace reports
 | 
			
		||||
    }
 | 
			
		||||
    options = {}
 | 
			
		||||
 | 
			
		||||
    requires = [
 | 
			
		||||
        'boost/1.83.0',
 | 
			
		||||
        'cassandra-cpp-driver/2.17.0',
 | 
			
		||||
        'fmt/10.1.1',
 | 
			
		||||
        'protobuf/3.21.9',
 | 
			
		||||
        'fmt/11.2.0',
 | 
			
		||||
        'protobuf/3.21.12',
 | 
			
		||||
        'grpc/1.50.1',
 | 
			
		||||
        'openssl/1.1.1v',
 | 
			
		||||
        'xrpl/2.5.0-b1',
 | 
			
		||||
        'openssl/1.1.1w',
 | 
			
		||||
        'xrpl/2.6.1',
 | 
			
		||||
        'zlib/1.3.1',
 | 
			
		||||
        'libbacktrace/cci.20210118'
 | 
			
		||||
        'libbacktrace/cci.20210118',
 | 
			
		||||
        'spdlog/1.15.3',
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    default_options = {
 | 
			
		||||
        'static': False,
 | 
			
		||||
        'fPIC': True,
 | 
			
		||||
        'verbose': False,
 | 
			
		||||
        'tests': False,
 | 
			
		||||
        'integration_tests': False,
 | 
			
		||||
        'benchmark': False,
 | 
			
		||||
        'packaging': False,
 | 
			
		||||
        'coverage': False,
 | 
			
		||||
        'lint': False,
 | 
			
		||||
        'docs': False,
 | 
			
		||||
        'snapshot': False,
 | 
			
		||||
        'time_trace': False,
 | 
			
		||||
 | 
			
		||||
        'xrpl/*:tests': False,
 | 
			
		||||
        'xrpl/*:rocksdb': False,
 | 
			
		||||
        'cassandra-cpp-driver/*:shared': False,
 | 
			
		||||
@@ -70,10 +45,8 @@ class Clio(ConanFile):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    def requirements(self):
 | 
			
		||||
        if self.options.tests or self.options.integration_tests:
 | 
			
		||||
            self.requires('gtest/1.14.0')
 | 
			
		||||
        if self.options.benchmark:
 | 
			
		||||
            self.requires('benchmark/1.8.3')
 | 
			
		||||
        self.requires('gtest/1.14.0')
 | 
			
		||||
        self.requires('benchmark/1.9.4')
 | 
			
		||||
 | 
			
		||||
    def configure(self):
 | 
			
		||||
        if self.settings.compiler == 'apple-clang':
 | 
			
		||||
@@ -89,17 +62,6 @@ class Clio(ConanFile):
 | 
			
		||||
 | 
			
		||||
    def generate(self):
 | 
			
		||||
        tc = CMakeToolchain(self)
 | 
			
		||||
        tc.variables['verbose'] = self.options.verbose
 | 
			
		||||
        tc.variables['static'] = self.options.static
 | 
			
		||||
        tc.variables['tests'] = self.options.tests
 | 
			
		||||
        tc.variables['integration_tests'] = self.options.integration_tests
 | 
			
		||||
        tc.variables['coverage'] = self.options.coverage
 | 
			
		||||
        tc.variables['lint'] = self.options.lint
 | 
			
		||||
        tc.variables['docs'] = self.options.docs
 | 
			
		||||
        tc.variables['packaging'] = self.options.packaging
 | 
			
		||||
        tc.variables['benchmark'] = self.options.benchmark
 | 
			
		||||
        tc.variables['snapshot'] = self.options.snapshot
 | 
			
		||||
        tc.variables['time_trace'] = self.options.time_trace
 | 
			
		||||
        tc.generate()
 | 
			
		||||
 | 
			
		||||
    def build(self):
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,13 @@
 | 
			
		||||
FROM rippleci/clio_clang:16
 | 
			
		||||
ARG GHCR_REPO=invalid
 | 
			
		||||
ARG CLANG_MAJOR_VERSION=invalid
 | 
			
		||||
ARG GCC_VERSION=invalid
 | 
			
		||||
 | 
			
		||||
FROM ${GHCR_REPO}/clio-gcc:${GCC_VERSION} AS clio-gcc
 | 
			
		||||
FROM ${GHCR_REPO}/clio-tools:latest AS clio-tools
 | 
			
		||||
 | 
			
		||||
FROM ${GHCR_REPO}/clio-clang:${CLANG_MAJOR_VERSION}
 | 
			
		||||
 | 
			
		||||
ARG DEBIAN_FRONTEND=noninteractive
 | 
			
		||||
ARG TARGETARCH
 | 
			
		||||
 | 
			
		||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 | 
			
		||||
 | 
			
		||||
@@ -13,112 +20,110 @@ SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 | 
			
		||||
USER root
 | 
			
		||||
WORKDIR /root
 | 
			
		||||
 | 
			
		||||
ENV CCACHE_VERSION=4.10.2 \
 | 
			
		||||
    LLVM_TOOLS_VERSION=19 \
 | 
			
		||||
    GH_VERSION=2.40.0 \
 | 
			
		||||
    DOXYGEN_VERSION=1.12.0 \
 | 
			
		||||
    CLANG_BUILD_ANALYZER_VERSION=1.6.0 \
 | 
			
		||||
    GIT_CLIFF_VERSION=2.8.0
 | 
			
		||||
# Install common tools and dependencies
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        curl \
 | 
			
		||||
        dpkg-dev \
 | 
			
		||||
        file \
 | 
			
		||||
        git \
 | 
			
		||||
        git-lfs \
 | 
			
		||||
        gnupg \
 | 
			
		||||
        graphviz \
 | 
			
		||||
        jq \
 | 
			
		||||
        # libgmp, libmpfr and libncurses are gdb dependencies
 | 
			
		||||
        libgmp-dev \
 | 
			
		||||
        libmpfr-dev \
 | 
			
		||||
        libncurses-dev \
 | 
			
		||||
        make \
 | 
			
		||||
        ninja-build \
 | 
			
		||||
        wget \
 | 
			
		||||
        zip \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
# Add repositories
 | 
			
		||||
RUN apt-get -qq update \
 | 
			
		||||
    && apt-get -qq install -y --no-install-recommends --no-install-suggests gnupg wget curl software-properties-common \
 | 
			
		||||
    && echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-${LLVM_TOOLS_VERSION} main" >> /etc/apt/sources.list \
 | 
			
		||||
    && wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add - && \
 | 
			
		||||
    apt-get clean && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
# Install Python tools
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        python3 \
 | 
			
		||||
        python3-pip \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
# Install packages
 | 
			
		||||
RUN apt update -qq \
 | 
			
		||||
    && apt install -y --no-install-recommends --no-install-suggests python3 python3-pip git git-lfs make ninja-build flex bison jq graphviz \
 | 
			
		||||
    clang-tidy-${LLVM_TOOLS_VERSION} clang-tools-${LLVM_TOOLS_VERSION} \
 | 
			
		||||
    && pip3 install -q --upgrade --no-cache-dir pip && pip3 install -q --no-cache-dir conan==1.62 gcovr cmake==3.31.6 pre-commit \
 | 
			
		||||
    && apt-get clean && apt remove -y software-properties-common
 | 
			
		||||
RUN pip install -q --no-cache-dir \
 | 
			
		||||
        # TODO: Remove this once we switch to newer Ubuntu base image
 | 
			
		||||
        # lxml 6.0.0 is not compatible with our image
 | 
			
		||||
        'lxml<6.0.0' \
 | 
			
		||||
        cmake \
 | 
			
		||||
        conan==2.20.1 \
 | 
			
		||||
        gcovr
 | 
			
		||||
 | 
			
		||||
# Install gcc-12 and make ldconfig aware of the new libstdc++ location (for gcc)
 | 
			
		||||
# Install LLVM tools
 | 
			
		||||
ARG LLVM_TOOLS_VERSION=20
 | 
			
		||||
 | 
			
		||||
RUN echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-${LLVM_TOOLS_VERSION} main" >> /etc/apt/sources.list \
 | 
			
		||||
    && wget --progress=dot:giga -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
 | 
			
		||||
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        clang-tidy-${LLVM_TOOLS_VERSION} \
 | 
			
		||||
        clang-tools-${LLVM_TOOLS_VERSION} \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
ARG GCC_MAJOR_VERSION=invalid
 | 
			
		||||
 | 
			
		||||
# Install custom-built gcc and make ldconfig aware of the new libstdc++ location (for gcc)
 | 
			
		||||
# Note: Clang is using libc++ instead
 | 
			
		||||
COPY --from=rippleci/clio_gcc:12.3.0 /gcc12.deb /
 | 
			
		||||
RUN apt update && apt-get install -y binutils libc6-dev \
 | 
			
		||||
    && dpkg -i /gcc12.deb \
 | 
			
		||||
    && rm -rf /gcc12.deb \
 | 
			
		||||
COPY --from=clio-gcc /gcc${GCC_MAJOR_VERSION}.deb /
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        binutils \
 | 
			
		||||
        libc6-dev \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/* \
 | 
			
		||||
    && dpkg -i /gcc${GCC_MAJOR_VERSION}.deb \
 | 
			
		||||
    && rm -rf /gcc${GCC_MAJOR_VERSION}.deb \
 | 
			
		||||
    && ldconfig
 | 
			
		||||
 | 
			
		||||
# Rewire to use gcc-12 as default compiler
 | 
			
		||||
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-12 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-12 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-12 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-12 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-12 100
 | 
			
		||||
# Rewire to use our custom-built gcc as default compiler
 | 
			
		||||
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-${GCC_MAJOR_VERSION} 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-${GCC_MAJOR_VERSION} 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCC_MAJOR_VERSION} 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-${GCC_MAJOR_VERSION} 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-${GCC_MAJOR_VERSION} 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-${GCC_MAJOR_VERSION} 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-${GCC_MAJOR_VERSION} 100
 | 
			
		||||
 | 
			
		||||
WORKDIR /tmp
 | 
			
		||||
 | 
			
		||||
# Install ccache from source
 | 
			
		||||
RUN wget "https://github.com/ccache/ccache/releases/download/v${CCACHE_VERSION}/ccache-${CCACHE_VERSION}.tar.gz" \
 | 
			
		||||
    && tar xf "ccache-${CCACHE_VERSION}.tar.gz" \
 | 
			
		||||
    && cd "ccache-${CCACHE_VERSION}" \
 | 
			
		||||
    && mkdir build && cd build \
 | 
			
		||||
    && cmake -GNinja -DCMAKE_BUILD_TYPE=Release .. \
 | 
			
		||||
    && cmake --build . --target install \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
# Install doxygen from source
 | 
			
		||||
RUN wget "https://github.com/doxygen/doxygen/releases/download/Release_${DOXYGEN_VERSION//./_}/doxygen-${DOXYGEN_VERSION}.src.tar.gz" \
 | 
			
		||||
    && tar xf "doxygen-${DOXYGEN_VERSION}.src.tar.gz" \
 | 
			
		||||
    && cd "doxygen-${DOXYGEN_VERSION}" \
 | 
			
		||||
    && mkdir build && cd build \
 | 
			
		||||
    && cmake -GNinja -DCMAKE_BUILD_TYPE=Release .. \
 | 
			
		||||
    && cmake --build . --target install \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
# Install ClangBuildAnalyzer
 | 
			
		||||
RUN wget "https://github.com/aras-p/ClangBuildAnalyzer/releases/download/v${CLANG_BUILD_ANALYZER_VERSION}/ClangBuildAnalyzer-linux" \
 | 
			
		||||
    && chmod +x ClangBuildAnalyzer-linux \
 | 
			
		||||
    && mv ClangBuildAnalyzer-linux /usr/bin/ClangBuildAnalyzer \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
# Install git-cliff
 | 
			
		||||
RUN wget "https://github.com/orhun/git-cliff/releases/download/v${GIT_CLIFF_VERSION}/git-cliff-${GIT_CLIFF_VERSION}-x86_64-unknown-linux-musl.tar.gz" \
 | 
			
		||||
    && tar xf git-cliff-${GIT_CLIFF_VERSION}-x86_64-unknown-linux-musl.tar.gz \
 | 
			
		||||
    && mv git-cliff-${GIT_CLIFF_VERSION}/git-cliff /usr/bin/git-cliff \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
# Install gh
 | 
			
		||||
RUN wget "https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_linux_${TARGETARCH}.tar.gz" \
 | 
			
		||||
    && tar xf gh_${GH_VERSION}_linux_${TARGETARCH}.tar.gz \
 | 
			
		||||
    && mv gh_${GH_VERSION}_linux_${TARGETARCH}/bin/gh /usr/bin/gh \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
COPY --from=clio-tools \
 | 
			
		||||
    /usr/local/bin/mold \
 | 
			
		||||
    /usr/local/bin/ld.mold \
 | 
			
		||||
    /usr/local/bin/ccache \
 | 
			
		||||
    /usr/local/bin/doxygen \
 | 
			
		||||
    /usr/local/bin/ClangBuildAnalyzer \
 | 
			
		||||
    /usr/local/bin/git-cliff \
 | 
			
		||||
    /usr/local/bin/gh \
 | 
			
		||||
    /usr/local/bin/gdb \
 | 
			
		||||
    /usr/local/bin/
 | 
			
		||||
 | 
			
		||||
WORKDIR /root
 | 
			
		||||
 | 
			
		||||
# Setup conan
 | 
			
		||||
RUN conan remote add --insert 0 conan-non-prod http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
 | 
			
		||||
RUN conan remote add --index 0 xrplf https://conan.ripplex.io
 | 
			
		||||
 | 
			
		||||
# Note: intentionally leaving cppstd=20
 | 
			
		||||
RUN conan profile new gcc --detect \
 | 
			
		||||
    && conan profile update settings.compiler=gcc gcc \
 | 
			
		||||
    && conan profile update settings.compiler.version=12 gcc \
 | 
			
		||||
    && conan profile update settings.compiler.cppstd=20 gcc \
 | 
			
		||||
    && conan profile update settings.compiler.libcxx=libstdc++11 gcc \
 | 
			
		||||
    && conan profile update env.CC=/usr/bin/gcc-12 gcc \
 | 
			
		||||
    && conan profile update env.CXX=/usr/bin/g++-12 gcc \
 | 
			
		||||
    && conan profile update "conf.tools.build:compiler_executables={\"c\": \"/usr/bin/gcc-12\", \"cpp\": \"/usr/bin/g++-12\"}" gcc
 | 
			
		||||
WORKDIR /root/.conan2
 | 
			
		||||
COPY conan/global.conf ./global.conf
 | 
			
		||||
 | 
			
		||||
RUN conan profile new clang --detect \
 | 
			
		||||
    && conan profile update settings.compiler=clang clang \
 | 
			
		||||
    && conan profile update settings.compiler.version=16 clang \
 | 
			
		||||
    && conan profile update settings.compiler.cppstd=20 clang \
 | 
			
		||||
    && conan profile update settings.compiler.libcxx=libc++ clang \
 | 
			
		||||
    && conan profile update env.CC=/usr/bin/clang-16 clang \
 | 
			
		||||
    && conan profile update env.CXX=/usr/bin/clang++-16 clang \
 | 
			
		||||
    && conan profile update env.CXXFLAGS="-DBOOST_ASIO_DISABLE_CONCEPTS" clang \
 | 
			
		||||
    && conan profile update "conf.tools.build:compiler_executables={\"c\": \"/usr/bin/clang-16\", \"cpp\": \"/usr/bin/clang++-16\"}" clang
 | 
			
		||||
WORKDIR /root/.conan2/profiles
 | 
			
		||||
 | 
			
		||||
RUN echo "include(gcc)" >> .conan/profiles/default
 | 
			
		||||
COPY conan/clang.profile ./clang
 | 
			
		||||
COPY conan/sanitizer_template.profile ./clang.asan
 | 
			
		||||
COPY conan/sanitizer_template.profile ./clang.tsan
 | 
			
		||||
COPY conan/sanitizer_template.profile ./clang.ubsan
 | 
			
		||||
 | 
			
		||||
COPY conan/gcc.asan /root/.conan/profiles
 | 
			
		||||
COPY conan/gcc.tsan /root/.conan/profiles
 | 
			
		||||
COPY conan/gcc.ubsan /root/.conan/profiles
 | 
			
		||||
COPY conan/clang.asan /root/.conan/profiles
 | 
			
		||||
COPY conan/clang.tsan /root/.conan/profiles
 | 
			
		||||
COPY conan/clang.ubsan /root/.conan/profiles
 | 
			
		||||
COPY conan/gcc.profile ./gcc
 | 
			
		||||
COPY conan/sanitizer_template.profile ./gcc.asan
 | 
			
		||||
COPY conan/sanitizer_template.profile ./gcc.tsan
 | 
			
		||||
COPY conan/sanitizer_template.profile ./gcc.ubsan
 | 
			
		||||
 | 
			
		||||
WORKDIR /root
 | 
			
		||||
 
 | 
			
		||||
@@ -5,13 +5,20 @@ It is used in [Clio Github Actions](https://github.com/XRPLF/clio/actions) but c
 | 
			
		||||
 | 
			
		||||
The image is based on Ubuntu 20.04 and contains:
 | 
			
		||||
 | 
			
		||||
- clang 16.0.6
 | 
			
		||||
- gcc 12.3
 | 
			
		||||
- doxygen 1.12
 | 
			
		||||
- gh 2.40
 | 
			
		||||
- ccache 4.10.2
 | 
			
		||||
- conan 1.62
 | 
			
		||||
- ccache 4.11.3
 | 
			
		||||
- Clang 19
 | 
			
		||||
- ClangBuildAnalyzer 1.6.0
 | 
			
		||||
- Conan 2.20.1
 | 
			
		||||
- Doxygen 1.14
 | 
			
		||||
- GCC 15.2.0
 | 
			
		||||
- GDB 16.3
 | 
			
		||||
- gh 2.74
 | 
			
		||||
- git-cliff 2.9.1
 | 
			
		||||
- mold 2.40.1
 | 
			
		||||
- Python 3.13
 | 
			
		||||
- and some other useful tools
 | 
			
		||||
 | 
			
		||||
Conan is set up to build Clio without any additional steps. There are two preset conan profiles: `clang` and `gcc` to use corresponding compiler. By default conan is setup to use `gcc`.
 | 
			
		||||
Sanitizer builds for `ASAN`, `TSAN` and `UBSAN` are enabled via conan profiles for each of the supported compilers. These can be selected using the following pattern (all lowercase): `[compiler].[sanitizer]` (e.g. `--profile gcc.tsan`).
 | 
			
		||||
Conan is set up to build Clio without any additional steps.
 | 
			
		||||
There are two preset conan profiles: `clang` and `gcc` to use corresponding compiler.
 | 
			
		||||
`ASan`, `TSan` and `UBSan` sanitizer builds are enabled via conan profiles for each of the supported compilers.
 | 
			
		||||
These can be selected using the following pattern (all lowercase): `[compiler].[sanitizer]` (e.g. `--profile:all gcc.tsan`).
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
include(clang)
 | 
			
		||||
 | 
			
		||||
[options]
 | 
			
		||||
boost:extra_b2_flags="cxxflags=\"-fsanitize=address\" linkflags=\"-fsanitize=address\""
 | 
			
		||||
boost:without_stacktrace=True
 | 
			
		||||
[env]
 | 
			
		||||
CFLAGS="-fsanitize=address"
 | 
			
		||||
CXXFLAGS="-fsanitize=address"
 | 
			
		||||
LDFLAGS="-fsanitize=address"
 | 
			
		||||
							
								
								
									
										12
									
								
								docker/ci/conan/clang.profile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								docker/ci/conan/clang.profile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
[settings]
 | 
			
		||||
arch={{detect_api.detect_arch()}}
 | 
			
		||||
build_type=Release
 | 
			
		||||
compiler=clang
 | 
			
		||||
compiler.cppstd=20
 | 
			
		||||
compiler.libcxx=libc++
 | 
			
		||||
compiler.version=19
 | 
			
		||||
os=Linux
 | 
			
		||||
 | 
			
		||||
[conf]
 | 
			
		||||
tools.build:compiler_executables={"c": "/usr/bin/clang-19", "cpp": "/usr/bin/clang++-19"}
 | 
			
		||||
grpc/1.50.1:tools.build:cxxflags+=["-Wno-missing-template-arg-list-after-template-kw"]
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
include(clang)
 | 
			
		||||
 | 
			
		||||
[options]
 | 
			
		||||
boost:extra_b2_flags="cxxflags=\"-fsanitize=thread\" linkflags=\"-fsanitize=thread\""
 | 
			
		||||
boost:without_stacktrace=True
 | 
			
		||||
[env]
 | 
			
		||||
CFLAGS="-fsanitize=thread"
 | 
			
		||||
CXXFLAGS="-fsanitize=thread"
 | 
			
		||||
LDFLAGS="-fsanitize=thread"
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
include(clang)
 | 
			
		||||
 | 
			
		||||
[options]
 | 
			
		||||
boost:extra_b2_flags="cxxflags=\"-fsanitize=undefined\" linkflags=\"-fsanitize=undefined\""
 | 
			
		||||
boost:without_stacktrace=True
 | 
			
		||||
[env]
 | 
			
		||||
CFLAGS="-fsanitize=undefined"
 | 
			
		||||
CXXFLAGS="-fsanitize=undefined"
 | 
			
		||||
LDFLAGS="-fsanitize=undefined"
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
include(gcc)
 | 
			
		||||
 | 
			
		||||
[options]
 | 
			
		||||
boost:extra_b2_flags="cxxflags=\"-fsanitize=address\" linkflags=\"-fsanitize=address\""
 | 
			
		||||
boost:without_stacktrace=True
 | 
			
		||||
[env]
 | 
			
		||||
CFLAGS="-fsanitize=address"
 | 
			
		||||
CXXFLAGS="-fsanitize=address"
 | 
			
		||||
LDFLAGS="-fsanitize=address"
 | 
			
		||||
							
								
								
									
										11
									
								
								docker/ci/conan/gcc.profile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								docker/ci/conan/gcc.profile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
[settings]
 | 
			
		||||
arch={{detect_api.detect_arch()}}
 | 
			
		||||
build_type=Release
 | 
			
		||||
compiler=gcc
 | 
			
		||||
compiler.cppstd=20
 | 
			
		||||
compiler.libcxx=libstdc++11
 | 
			
		||||
compiler.version=15
 | 
			
		||||
os=Linux
 | 
			
		||||
 | 
			
		||||
[conf]
 | 
			
		||||
tools.build:compiler_executables={"c": "/usr/bin/gcc-15", "cpp": "/usr/bin/g++-15"}
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
include(gcc)
 | 
			
		||||
 | 
			
		||||
[options]
 | 
			
		||||
boost:extra_b2_flags="cxxflags=\"-fsanitize=thread\" linkflags=\"-fsanitize=thread\""
 | 
			
		||||
boost:without_stacktrace=True
 | 
			
		||||
[env]
 | 
			
		||||
CFLAGS="-fsanitize=thread"
 | 
			
		||||
CXXFLAGS="-fsanitize=thread"
 | 
			
		||||
LDFLAGS="-fsanitize=thread"
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
include(gcc)
 | 
			
		||||
 | 
			
		||||
[options]
 | 
			
		||||
boost:extra_b2_flags="cxxflags=\"-fsanitize=undefined\" linkflags=\"-fsanitize=undefined\""
 | 
			
		||||
boost:without_stacktrace=True
 | 
			
		||||
[env]
 | 
			
		||||
CFLAGS="-fsanitize=undefined"
 | 
			
		||||
CXXFLAGS="-fsanitize=undefined"
 | 
			
		||||
LDFLAGS="-fsanitize=undefined"
 | 
			
		||||
							
								
								
									
										2
									
								
								docker/ci/conan/global.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								docker/ci/conan/global.conf
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
core.download:parallel={{os.cpu_count()}}
 | 
			
		||||
core.upload:parallel={{os.cpu_count()}}
 | 
			
		||||
							
								
								
									
										23
									
								
								docker/ci/conan/sanitizer_template.profile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								docker/ci/conan/sanitizer_template.profile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
{% set compiler, sani = profile_name.split('.') %}
 | 
			
		||||
 | 
			
		||||
{% set sanitizer_opt_map = {"asan": "address", "tsan": "thread", "ubsan": "undefined"} %}
 | 
			
		||||
{% set sanitizer = sanitizer_opt_map[sani] %}
 | 
			
		||||
 | 
			
		||||
{% set sanitizer_build_flags_str = "-fsanitize=" ~ sanitizer ~ " -g -O1 -fno-omit-frame-pointer" %}
 | 
			
		||||
{% set sanitizer_build_flags = sanitizer_build_flags_str.split(' ') %}
 | 
			
		||||
{% set sanitizer_link_flags_str = "-fsanitize=" ~ sanitizer %}
 | 
			
		||||
{% set sanitizer_link_flags = sanitizer_link_flags_str.split(' ') %}
 | 
			
		||||
 | 
			
		||||
include({{ compiler }})
 | 
			
		||||
 | 
			
		||||
[options]
 | 
			
		||||
boost/*:extra_b2_flags="cxxflags=\"{{ sanitizer_build_flags_str }}\" linkflags=\"{{ sanitizer_link_flags_str }}\""
 | 
			
		||||
boost/*:without_stacktrace=True
 | 
			
		||||
 | 
			
		||||
[conf]
 | 
			
		||||
tools.build:cflags+={{ sanitizer_build_flags }}
 | 
			
		||||
tools.build:cxxflags+={{ sanitizer_build_flags }}
 | 
			
		||||
tools.build:exelinkflags+={{ sanitizer_link_flags }}
 | 
			
		||||
tools.build:sharedlinkflags+={{ sanitizer_link_flags }}
 | 
			
		||||
 | 
			
		||||
tools.info.package_id:confs+=["tools.build:cflags", "tools.build:cxxflags", "tools.build:exelinkflags", "tools.build:sharedlinkflags"]
 | 
			
		||||
@@ -1,15 +1,20 @@
 | 
			
		||||
FROM ubuntu:22.04
 | 
			
		||||
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        libatomic1 \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
RUN groupadd -g 10001 clio \
 | 
			
		||||
    && useradd -u 10000 -g 10001 -s /bin/bash clio
 | 
			
		||||
 | 
			
		||||
COPY ./clio_server /opt/clio/bin/clio_server
 | 
			
		||||
 | 
			
		||||
RUN ln -s /opt/clio/bin/clio_server /usr/local/bin/clio_server && \
 | 
			
		||||
    mkdir -p /opt/clio/etc/ && \
 | 
			
		||||
    mkdir -p /opt/clio/log/ && \
 | 
			
		||||
    groupadd -g 10001 clio && \
 | 
			
		||||
    useradd -u 10000 -g 10001 -s /bin/bash clio && \
 | 
			
		||||
    chown clio:clio /opt/clio/log && \
 | 
			
		||||
    apt update && \
 | 
			
		||||
    apt install -y libatomic1
 | 
			
		||||
RUN ln -s /opt/clio/bin/clio_server /usr/local/bin/clio_server \
 | 
			
		||||
    && mkdir -p /opt/clio/etc/ \
 | 
			
		||||
    && mkdir -p /opt/clio/log/ \
 | 
			
		||||
    && chown clio:clio /opt/clio/log
 | 
			
		||||
 | 
			
		||||
USER clio
 | 
			
		||||
ENTRYPOINT ["/opt/clio/bin/clio_server"]
 | 
			
		||||
 
 | 
			
		||||
@@ -13,8 +13,8 @@ Clio repository provides an [example](https://github.com/XRPLF/clio/blob/develop
 | 
			
		||||
 | 
			
		||||
Config file recommendations:
 | 
			
		||||
 | 
			
		||||
- Set `log_to_console` to `false` if you want to avoid logs being written to `stdout`.
 | 
			
		||||
- Set `log_directory` to `/opt/clio/log` to store logs in a volume.
 | 
			
		||||
- Set `log.enable_console` to `false` if you want to avoid logs being written to `stdout`.
 | 
			
		||||
- Set `log.directory` to `/opt/clio/log` to store logs in a volume.
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +0,0 @@
 | 
			
		||||
FROM ubuntu:focal
 | 
			
		||||
ARG DEBIAN_FRONTEND=noninteractive
 | 
			
		||||
ARG TARGETARCH
 | 
			
		||||
 | 
			
		||||
SHELL ["/bin/bash", "-c"]
 | 
			
		||||
 | 
			
		||||
# hadolint ignore=DL3002
 | 
			
		||||
USER root
 | 
			
		||||
WORKDIR /root
 | 
			
		||||
 | 
			
		||||
ENV CLANG_VERSION=16
 | 
			
		||||
 | 
			
		||||
RUN apt update -qq \
 | 
			
		||||
    && apt install -qq -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
    wget software-properties-common gnupg
 | 
			
		||||
 | 
			
		||||
RUN wget https://apt.llvm.org/llvm.sh \
 | 
			
		||||
    && chmod +x llvm.sh \
 | 
			
		||||
    && ./llvm.sh ${CLANG_VERSION} \
 | 
			
		||||
    && rm -rf llvm.sh \
 | 
			
		||||
    && apt-get install -y libc++-16-dev libc++abi-16-dev
 | 
			
		||||
							
								
								
									
										32
									
								
								docker/compilers/clang/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								docker/compilers/clang/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
FROM ubuntu:20.04
 | 
			
		||||
 | 
			
		||||
ARG DEBIAN_FRONTEND=noninteractive
 | 
			
		||||
 | 
			
		||||
SHELL ["/bin/bash", "-c"]
 | 
			
		||||
 | 
			
		||||
# hadolint ignore=DL3002
 | 
			
		||||
USER root
 | 
			
		||||
WORKDIR /root
 | 
			
		||||
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        wget \
 | 
			
		||||
        software-properties-common \
 | 
			
		||||
        gnupg \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
ARG CLANG_MAJOR_VERSION=invalid
 | 
			
		||||
# Bump this version to force rebuild of the image
 | 
			
		||||
ARG BUILD_VERSION=1
 | 
			
		||||
 | 
			
		||||
RUN wget --progress=dot:giga https://apt.llvm.org/llvm.sh \
 | 
			
		||||
    && chmod +x llvm.sh \
 | 
			
		||||
    && ./llvm.sh ${CLANG_MAJOR_VERSION} \
 | 
			
		||||
    && rm -rf llvm.sh \
 | 
			
		||||
    && apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        libc++-${CLANG_MAJOR_VERSION}-dev \
 | 
			
		||||
        libc++abi-${CLANG_MAJOR_VERSION}-dev \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
							
								
								
									
										3
									
								
								docker/compilers/clang/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								docker/compilers/clang/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
# Clang compiler
 | 
			
		||||
 | 
			
		||||
This image contains clang compiler to build <https://github.com/XRPLF/clio>.
 | 
			
		||||
@@ -1,74 +0,0 @@
 | 
			
		||||
FROM ubuntu:focal as build
 | 
			
		||||
 | 
			
		||||
ARG DEBIAN_FRONTEND=noninteractive
 | 
			
		||||
ARG TARGETARCH
 | 
			
		||||
ARG UBUNTU_VERSION=20.04
 | 
			
		||||
ARG GCC_VERSION=12.3.0
 | 
			
		||||
ARG BUILD_VERSION=1
 | 
			
		||||
 | 
			
		||||
RUN apt update && apt install -y wget build-essential file flex libz-dev libzstd-dev
 | 
			
		||||
RUN wget https://gcc.gnu.org/pub/gcc/releases/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.gz \
 | 
			
		||||
    && tar xf gcc-$GCC_VERSION.tar.gz \
 | 
			
		||||
    && cd /gcc-$GCC_VERSION && ./contrib/download_prerequisites
 | 
			
		||||
 | 
			
		||||
RUN mkdir /${TARGETARCH}-gcc-12
 | 
			
		||||
WORKDIR /${TARGETARCH}-gcc-12
 | 
			
		||||
RUN /gcc-$GCC_VERSION/configure \
 | 
			
		||||
    --with-pkgversion="clio-build-$BUILD_VERSION https://github.com/XRPLF/clio" \
 | 
			
		||||
    --enable-languages=c,c++ \
 | 
			
		||||
    --prefix=/usr \
 | 
			
		||||
    --with-gcc-major-version-only \
 | 
			
		||||
    --program-suffix=-12 \
 | 
			
		||||
    --enable-shared \
 | 
			
		||||
    --enable-linker-build-id \
 | 
			
		||||
    --libexecdir=/usr/lib \
 | 
			
		||||
    --without-included-gettext \
 | 
			
		||||
    --enable-threads=posix \
 | 
			
		||||
    --libdir=/usr/lib \
 | 
			
		||||
    --disable-nls \
 | 
			
		||||
    --enable-clocale=gnu \
 | 
			
		||||
    --enable-libstdcxx-backtrace=yes \
 | 
			
		||||
    --enable-libstdcxx-debug \
 | 
			
		||||
    --enable-libstdcxx-time=yes \
 | 
			
		||||
    --with-default-libstdcxx-abi=new \
 | 
			
		||||
    --enable-gnu-unique-object \
 | 
			
		||||
    --disable-vtable-verify \
 | 
			
		||||
    --enable-plugin \
 | 
			
		||||
    --enable-default-pie \
 | 
			
		||||
    --with-system-zlib \
 | 
			
		||||
    --enable-libphobos-checking=release \
 | 
			
		||||
    --with-target-system-zlib=auto \
 | 
			
		||||
    --disable-werror \
 | 
			
		||||
    --enable-cet \
 | 
			
		||||
    --disable-multilib \
 | 
			
		||||
    --without-cuda-driver \
 | 
			
		||||
    --enable-checking=release \
 | 
			
		||||
    && make -j "$(nproc)" \
 | 
			
		||||
    && make install-strip DESTDIR=/gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION \
 | 
			
		||||
    && mkdir -p /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/usr/share/gdb/auto-load/usr/lib64 \
 | 
			
		||||
    && mv /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/usr/lib64/libstdc++.so.6.0.30-gdb.py /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.30-gdb.py
 | 
			
		||||
 | 
			
		||||
# Generate deb
 | 
			
		||||
WORKDIR /
 | 
			
		||||
COPY control.m4 /
 | 
			
		||||
COPY ld.so.conf /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/etc/ld.so.conf.d/1-gcc-12.conf
 | 
			
		||||
 | 
			
		||||
RUN mkdir /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/DEBIAN \
 | 
			
		||||
    && m4 -P -DUBUNTU_VERSION=$UBUNTU_VERSION -DVERSION=$GCC_VERSION-$BUILD_VERSION -DTARGETARCH=$TARGETARCH control.m4 > /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/DEBIAN/control \
 | 
			
		||||
    && dpkg-deb --build --root-owner-group /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION /gcc12.deb
 | 
			
		||||
 | 
			
		||||
# Create final image
 | 
			
		||||
FROM ubuntu:focal as gcc
 | 
			
		||||
COPY --from=build /gcc12.deb /
 | 
			
		||||
 | 
			
		||||
# Make gcc-12 available but also leave gcc12.deb for others to copy if needed
 | 
			
		||||
RUN apt update && apt-get install -y binutils libc6-dev \
 | 
			
		||||
    && dpkg -i /gcc12.deb
 | 
			
		||||
 | 
			
		||||
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-12 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-12 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-12 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-12 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-12 100
 | 
			
		||||
@@ -1,6 +0,0 @@
 | 
			
		||||
Package: gcc-12-ubuntu-UBUNTUVERSION
 | 
			
		||||
Version: VERSION
 | 
			
		||||
Architecture: TARGETARCH
 | 
			
		||||
Maintainer: Alex Kremer <akremer@ripple.com>
 | 
			
		||||
Description: Gcc VERSION build for ubuntu UBUNTUVERSION
 | 
			
		||||
Depends: binutils, libc6-dev
 | 
			
		||||
							
								
								
									
										119
									
								
								docker/compilers/gcc/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								docker/compilers/gcc/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,119 @@
 | 
			
		||||
ARG UBUNTU_VERSION=20.04
 | 
			
		||||
 | 
			
		||||
ARG GCC_MAJOR_VERSION=invalid
 | 
			
		||||
 | 
			
		||||
FROM ubuntu:$UBUNTU_VERSION AS build
 | 
			
		||||
 | 
			
		||||
ARG UBUNTU_VERSION
 | 
			
		||||
 | 
			
		||||
ARG GCC_MAJOR_VERSION
 | 
			
		||||
 | 
			
		||||
ARG BUILD_VERSION=1
 | 
			
		||||
 | 
			
		||||
ARG DEBIAN_FRONTEND=noninteractive
 | 
			
		||||
ARG TARGETARCH
 | 
			
		||||
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        build-essential \
 | 
			
		||||
        file \
 | 
			
		||||
        flex \
 | 
			
		||||
        libz-dev \
 | 
			
		||||
        libzstd-dev \
 | 
			
		||||
        software-properties-common \
 | 
			
		||||
        wget \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
ARG GCC_VERSION
 | 
			
		||||
 | 
			
		||||
WORKDIR /
 | 
			
		||||
RUN wget --progress=dot:giga https://gcc.gnu.org/pub/gcc/releases/gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.gz \
 | 
			
		||||
    && tar xf gcc-$GCC_VERSION.tar.gz
 | 
			
		||||
 | 
			
		||||
WORKDIR /gcc-$GCC_VERSION
 | 
			
		||||
RUN ./contrib/download_prerequisites
 | 
			
		||||
 | 
			
		||||
RUN mkdir /gcc-build
 | 
			
		||||
WORKDIR /gcc-build
 | 
			
		||||
RUN /gcc-$GCC_VERSION/configure \
 | 
			
		||||
        --with-pkgversion="clio-build-$BUILD_VERSION https://github.com/XRPLF/clio" \
 | 
			
		||||
        --enable-languages=c,c++ \
 | 
			
		||||
        --prefix=/usr \
 | 
			
		||||
        --with-gcc-major-version-only \
 | 
			
		||||
        --program-suffix=-${GCC_MAJOR_VERSION} \
 | 
			
		||||
        --enable-shared \
 | 
			
		||||
        --enable-linker-build-id \
 | 
			
		||||
        --libexecdir=/usr/lib \
 | 
			
		||||
        --without-included-gettext \
 | 
			
		||||
        --enable-threads=posix \
 | 
			
		||||
        --libdir=/usr/lib \
 | 
			
		||||
        --disable-nls \
 | 
			
		||||
        --enable-clocale=gnu \
 | 
			
		||||
        --enable-libstdcxx-backtrace=yes \
 | 
			
		||||
        --enable-libstdcxx-debug \
 | 
			
		||||
        --enable-libstdcxx-time=yes \
 | 
			
		||||
        --with-default-libstdcxx-abi=new \
 | 
			
		||||
        --enable-gnu-unique-object \
 | 
			
		||||
        --disable-vtable-verify \
 | 
			
		||||
        --enable-plugin \
 | 
			
		||||
        --enable-default-pie \
 | 
			
		||||
        --with-system-zlib \
 | 
			
		||||
        --enable-libphobos-checking=release \
 | 
			
		||||
        --with-target-system-zlib=auto \
 | 
			
		||||
        --disable-werror \
 | 
			
		||||
        --enable-cet \
 | 
			
		||||
        --disable-multilib \
 | 
			
		||||
        --without-cuda-driver \
 | 
			
		||||
        --enable-checking=release
 | 
			
		||||
 | 
			
		||||
RUN make -j "$(nproc)"
 | 
			
		||||
RUN make install-strip DESTDIR=/gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION
 | 
			
		||||
 | 
			
		||||
RUN export GDB_AUTOLOAD_DIR="/gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/usr/share/gdb/auto-load/usr/lib64" \
 | 
			
		||||
    && mkdir -p "$GDB_AUTOLOAD_DIR" \
 | 
			
		||||
    && mv \
 | 
			
		||||
        /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/usr/lib64/libstdc++.so.*-gdb.py \
 | 
			
		||||
        $GDB_AUTOLOAD_DIR/
 | 
			
		||||
 | 
			
		||||
# Generate deb
 | 
			
		||||
WORKDIR /
 | 
			
		||||
COPY control.m4 /
 | 
			
		||||
COPY ld.so.conf /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/etc/ld.so.conf.d/1-gcc-${GCC_MAJOR_VERSION}.conf
 | 
			
		||||
 | 
			
		||||
RUN mkdir /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/DEBIAN \
 | 
			
		||||
    && m4 \
 | 
			
		||||
        -P \
 | 
			
		||||
        -DUBUNTU_VERSION=$UBUNTU_VERSION \
 | 
			
		||||
        -DVERSION=$GCC_VERSION-$BUILD_VERSION \
 | 
			
		||||
        -DTARGETARCH=$TARGETARCH \
 | 
			
		||||
        control.m4 > /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION/DEBIAN/control \
 | 
			
		||||
    && dpkg-deb \
 | 
			
		||||
        --build \
 | 
			
		||||
        --root-owner-group \
 | 
			
		||||
        /gcc-$GCC_VERSION-$BUILD_VERSION-ubuntu-$UBUNTU_VERSION \
 | 
			
		||||
        /gcc${GCC_MAJOR_VERSION}.deb
 | 
			
		||||
 | 
			
		||||
# Create final image
 | 
			
		||||
FROM ubuntu:$UBUNTU_VERSION
 | 
			
		||||
 | 
			
		||||
ARG GCC_MAJOR_VERSION
 | 
			
		||||
 | 
			
		||||
COPY --from=build /gcc${GCC_MAJOR_VERSION}.deb /
 | 
			
		||||
 | 
			
		||||
# Install gcc-${GCC_MAJOR_VERSION}, but also leave gcc${GCC_MAJOR_VERSION}.deb for others to copy if needed
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        binutils \
 | 
			
		||||
        libc6-dev \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/* \
 | 
			
		||||
    && dpkg -i /gcc${GCC_MAJOR_VERSION}.deb
 | 
			
		||||
 | 
			
		||||
RUN update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-${GCC_MAJOR_VERSION} 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-${GCC_MAJOR_VERSION} 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCC_MAJOR_VERSION} 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-${GCC_MAJOR_VERSION} 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-${GCC_MAJOR_VERSION} 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-dump-${GCC_MAJOR_VERSION} 100 \
 | 
			
		||||
    && update-alternatives --install /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-${GCC_MAJOR_VERSION} 100
 | 
			
		||||
							
								
								
									
										3
									
								
								docker/compilers/gcc/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								docker/compilers/gcc/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
# GCC compiler
 | 
			
		||||
 | 
			
		||||
This image contains GCC compiler to build <https://github.com/XRPLF/clio>.
 | 
			
		||||
							
								
								
									
										7
									
								
								docker/compilers/gcc/control.m4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								docker/compilers/gcc/control.m4
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
Package: gcc-15-ubuntu-UBUNTUVERSION
 | 
			
		||||
Version: VERSION
 | 
			
		||||
Architecture: TARGETARCH
 | 
			
		||||
Maintainer: Alex Kremer <akremer@ripple.com>
 | 
			
		||||
Uploaders: Ayaz Salikhov <asalikhov@ripple.com>
 | 
			
		||||
Description: GCC VERSION build for ubuntu UBUNTUVERSION
 | 
			
		||||
Depends: binutils, libc6-dev
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
services:
 | 
			
		||||
  clio_develop:
 | 
			
		||||
    image: ghcr.io/xrplf/clio-ci:latest
 | 
			
		||||
    image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
    volumes:
 | 
			
		||||
      - clio_develop_conan_data:/root/.conan/data
 | 
			
		||||
      - clio_develop_conan_data:/root/.conan2/p
 | 
			
		||||
      - clio_develop_ccache:/root/.ccache
 | 
			
		||||
      - ../../:/root/clio
 | 
			
		||||
      - clio_develop_build:/root/clio/build_docker
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										38
									
								
								docker/pre-commit/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								docker/pre-commit/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
ARG GHCR_REPO=invalid
 | 
			
		||||
FROM ${GHCR_REPO}/clio-tools:latest AS clio-tools
 | 
			
		||||
 | 
			
		||||
# We're using Ubuntu 24.04 to have a more recent version of Python
 | 
			
		||||
FROM ubuntu:24.04
 | 
			
		||||
 | 
			
		||||
ARG DEBIAN_FRONTEND=noninteractive
 | 
			
		||||
 | 
			
		||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 | 
			
		||||
 | 
			
		||||
# hadolint ignore=DL3002
 | 
			
		||||
USER root
 | 
			
		||||
WORKDIR /root
 | 
			
		||||
 | 
			
		||||
# Install common tools and dependencies
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        curl \
 | 
			
		||||
        git \
 | 
			
		||||
        libatomic1 \
 | 
			
		||||
        software-properties-common \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
# Install Python tools
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        python3 \
 | 
			
		||||
        python3-pip \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
RUN pip install -q --no-cache-dir --break-system-packages \
 | 
			
		||||
        pre-commit
 | 
			
		||||
 | 
			
		||||
COPY --from=clio-tools \
 | 
			
		||||
    /usr/local/bin/doxygen \
 | 
			
		||||
    /usr/local/bin/
 | 
			
		||||
							
								
								
									
										104
									
								
								docker/tools/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								docker/tools/Dockerfile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,104 @@
 | 
			
		||||
ARG GHCR_REPO=invalid
 | 
			
		||||
ARG GCC_VERSION=invalid
 | 
			
		||||
 | 
			
		||||
FROM ${GHCR_REPO}/clio-gcc:${GCC_VERSION}
 | 
			
		||||
 | 
			
		||||
ARG DEBIAN_FRONTEND=noninteractive
 | 
			
		||||
ARG TARGETARCH
 | 
			
		||||
 | 
			
		||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 | 
			
		||||
 | 
			
		||||
ARG BUILD_VERSION=2
 | 
			
		||||
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        ninja-build \
 | 
			
		||||
        python3 \
 | 
			
		||||
        python3-pip \
 | 
			
		||||
        software-properties-common \
 | 
			
		||||
        wget \
 | 
			
		||||
    && pip3 install -q --no-cache-dir \
 | 
			
		||||
        cmake \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
WORKDIR /tmp
 | 
			
		||||
 | 
			
		||||
ARG MOLD_VERSION=2.40.1
 | 
			
		||||
RUN wget --progress=dot:giga "https://github.com/rui314/mold/archive/refs/tags/v${MOLD_VERSION}.tar.gz" \
 | 
			
		||||
    && tar xf "v${MOLD_VERSION}.tar.gz" \
 | 
			
		||||
    && cd "mold-${MOLD_VERSION}" \
 | 
			
		||||
    && mkdir build \
 | 
			
		||||
    && cd build \
 | 
			
		||||
    && cmake -GNinja -DCMAKE_BUILD_TYPE=Release .. \
 | 
			
		||||
    && ninja install \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
ARG CCACHE_VERSION=4.11.3
 | 
			
		||||
RUN wget --progress=dot:giga "https://github.com/ccache/ccache/releases/download/v${CCACHE_VERSION}/ccache-${CCACHE_VERSION}.tar.gz" \
 | 
			
		||||
    && tar xf "ccache-${CCACHE_VERSION}.tar.gz" \
 | 
			
		||||
    && cd "ccache-${CCACHE_VERSION}" \
 | 
			
		||||
    && mkdir build \
 | 
			
		||||
    && cd build \
 | 
			
		||||
    && cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DENABLE_TESTING=False .. \
 | 
			
		||||
    && ninja install \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        bison \
 | 
			
		||||
        flex \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
ARG DOXYGEN_VERSION=1.14.0
 | 
			
		||||
RUN wget --progress=dot:giga "https://github.com/doxygen/doxygen/releases/download/Release_${DOXYGEN_VERSION//./_}/doxygen-${DOXYGEN_VERSION}.src.tar.gz" \
 | 
			
		||||
    && tar xf "doxygen-${DOXYGEN_VERSION}.src.tar.gz" \
 | 
			
		||||
    && cd "doxygen-${DOXYGEN_VERSION}" \
 | 
			
		||||
    && mkdir build \
 | 
			
		||||
    && cd build \
 | 
			
		||||
    && cmake -GNinja -DCMAKE_BUILD_TYPE=Release .. \
 | 
			
		||||
    && ninja install \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
ARG CLANG_BUILD_ANALYZER_VERSION=1.6.0
 | 
			
		||||
RUN wget --progress=dot:giga "https://github.com/aras-p/ClangBuildAnalyzer/archive/refs/tags/v${CLANG_BUILD_ANALYZER_VERSION}.tar.gz" \
 | 
			
		||||
    && tar xf "v${CLANG_BUILD_ANALYZER_VERSION}.tar.gz" \
 | 
			
		||||
    && cd "ClangBuildAnalyzer-${CLANG_BUILD_ANALYZER_VERSION}" \
 | 
			
		||||
    && mkdir build \
 | 
			
		||||
    && cd build \
 | 
			
		||||
    && cmake -GNinja -DCMAKE_BUILD_TYPE=Release .. \
 | 
			
		||||
    && ninja install \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
ARG GIT_CLIFF_VERSION=2.9.1
 | 
			
		||||
RUN wget --progress=dot:giga "https://github.com/orhun/git-cliff/releases/download/v${GIT_CLIFF_VERSION}/git-cliff-${GIT_CLIFF_VERSION}-x86_64-unknown-linux-musl.tar.gz" \
 | 
			
		||||
    && tar xf git-cliff-${GIT_CLIFF_VERSION}-x86_64-unknown-linux-musl.tar.gz \
 | 
			
		||||
    && mv git-cliff-${GIT_CLIFF_VERSION}/git-cliff /usr/local/bin/git-cliff \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
ARG GH_VERSION=2.74.0
 | 
			
		||||
RUN wget --progress=dot:giga "https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_linux_${TARGETARCH}.tar.gz" \
 | 
			
		||||
    && tar xf gh_${GH_VERSION}_linux_${TARGETARCH}.tar.gz \
 | 
			
		||||
    && mv gh_${GH_VERSION}_linux_${TARGETARCH}/bin/gh /usr/local/bin/gh \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
        libgmp-dev \
 | 
			
		||||
        libmpfr-dev \
 | 
			
		||||
        libncurses-dev \
 | 
			
		||||
        make \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
ARG GDB_VERSION=16.3
 | 
			
		||||
RUN wget --progress=dot:giga "https://sourceware.org/pub/gdb/releases/gdb-${GDB_VERSION}.tar.gz" \
 | 
			
		||||
    && tar xf "gdb-${GDB_VERSION}.tar.gz" \
 | 
			
		||||
    && cd "gdb-${GDB_VERSION}" \
 | 
			
		||||
    && ./configure --prefix=/usr/local \
 | 
			
		||||
    && make -j "$(nproc)" \
 | 
			
		||||
    && make install-gdb \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
WORKDIR /root
 | 
			
		||||
@@ -3,6 +3,8 @@ PROJECT_LOGO           = ${SOURCE}/docs/img/xrpl-logo.svg
 | 
			
		||||
PROJECT_NUMBER         = ${DOC_CLIO_VERSION}
 | 
			
		||||
PROJECT_BRIEF          = The XRP Ledger API server.
 | 
			
		||||
 | 
			
		||||
DOT_GRAPH_MAX_NODES    = 100
 | 
			
		||||
 | 
			
		||||
EXTRACT_ALL            = NO
 | 
			
		||||
EXTRACT_PRIVATE        = NO
 | 
			
		||||
EXTRACT_PACKAGE        = YES
 | 
			
		||||
@@ -13,6 +15,7 @@ EXTRACT_ANON_NSPACES   = NO
 | 
			
		||||
SORT_MEMBERS_CTORS_1ST = YES
 | 
			
		||||
 | 
			
		||||
INPUT                  = ${SOURCE}/src
 | 
			
		||||
USE_MDFILE_AS_MAINPAGE = ${SOURCE}/src/README.md
 | 
			
		||||
EXCLUDE_SYMBOLS        = ${EXCLUDES}
 | 
			
		||||
RECURSIVE              = YES
 | 
			
		||||
HAVE_DOT               = ${USE_DOT}
 | 
			
		||||
@@ -22,6 +25,7 @@ WARNINGS               = ${LINT}
 | 
			
		||||
WARN_NO_PARAMDOC       = ${LINT}
 | 
			
		||||
WARN_IF_INCOMPLETE_DOC = ${LINT}
 | 
			
		||||
WARN_IF_UNDOCUMENTED   = ${LINT}
 | 
			
		||||
WARN_AS_ERROR          = ${WARN_AS_ERROR}
 | 
			
		||||
 | 
			
		||||
GENERATE_LATEX         = NO
 | 
			
		||||
GENERATE_HTML          = YES
 | 
			
		||||
@@ -31,12 +35,18 @@ SORT_MEMBERS_CTORS_1ST = YES
 | 
			
		||||
GENERATE_TREEVIEW      = YES
 | 
			
		||||
DISABLE_INDEX          = NO
 | 
			
		||||
FULL_SIDEBAR           = NO
 | 
			
		||||
HTML_HEADER            = ${SOURCE}/docs/doxygen-awesome-theme/header.html
 | 
			
		||||
HTML_HEADER            = ${SOURCE}/docs/doxygen-awesome-theme/doxygen-custom/header.html
 | 
			
		||||
HTML_EXTRA_STYLESHEET  = ${SOURCE}/docs/doxygen-awesome-theme/doxygen-awesome.css \
 | 
			
		||||
                         ${SOURCE}/docs/doxygen-awesome-theme/doxygen-awesome-sidebar-only.css \
 | 
			
		||||
                         ${SOURCE}/docs/doxygen-awesome-theme/doxygen-awesome-sidebar-only-darkmode-toggle.css
 | 
			
		||||
                         ${SOURCE}/docs/doxygen-awesome-theme/doxygen-awesome-sidebar-only-darkmode-toggle.css \
 | 
			
		||||
                         ${SOURCE}/docs/doxygen-awesome-theme/doxygen-custom/custom.css \
 | 
			
		||||
                         ${SOURCE}/docs/doxygen-awesome-theme/doxygen-custom/theme-robot.css \
 | 
			
		||||
                         ${SOURCE}/docs/doxygen-awesome-theme/doxygen-custom/theme-round.css \
 | 
			
		||||
                         ${SOURCE}/docs/github-corner-disable.css
 | 
			
		||||
HTML_EXTRA_FILES       = ${SOURCE}/docs/doxygen-awesome-theme/doxygen-awesome-darkmode-toggle.js \
 | 
			
		||||
                         ${SOURCE}/docs/doxygen-awesome-theme/doxygen-awesome-interactive-toc.js
 | 
			
		||||
                         ${SOURCE}/docs/doxygen-awesome-theme/doxygen-awesome-fragment-copy-button.js \
 | 
			
		||||
                         ${SOURCE}/docs/doxygen-awesome-theme/doxygen-awesome-interactive-toc.js \
 | 
			
		||||
                         ${SOURCE}/docs/doxygen-awesome-theme/doxygen-custom/toggle-alternative-theme.js
 | 
			
		||||
 | 
			
		||||
HTML_COLORSTYLE        = LIGHT
 | 
			
		||||
HTML_COLORSTYLE_HUE    = 209
 | 
			
		||||
 
 | 
			
		||||
@@ -6,54 +6,83 @@
 | 
			
		||||
## Minimum Requirements
 | 
			
		||||
 | 
			
		||||
- [Python 3.7](https://www.python.org/downloads/)
 | 
			
		||||
- [Conan 1.55, <2.0](https://conan.io/downloads.html)
 | 
			
		||||
- [CMake 3.20, <4.0](https://cmake.org/download/)
 | 
			
		||||
- [Conan 2.20.1](https://conan.io/downloads.html)
 | 
			
		||||
- [CMake 3.20](https://cmake.org/download/)
 | 
			
		||||
- [**Optional**] [GCovr](https://gcc.gnu.org/onlinedocs/gcc/Gcov.html): needed for code coverage generation
 | 
			
		||||
- [**Optional**] [CCache](https://ccache.dev/): speeds up compilation if you are going to compile Clio often
 | 
			
		||||
 | 
			
		||||
We use our Docker image `ghcr.io/XRPLF/clio-ci` to build `Clio`, see [Building Clio with Docker](#building-clio-with-docker).
 | 
			
		||||
You can find information about exact compiler versions and tools in the [image's README](https://github.com/XRPLF/clio/blob/develop/docker/ci/README.md).
 | 
			
		||||
 | 
			
		||||
The following compiler version are guaranteed to work.
 | 
			
		||||
Any compiler with lower version may not be able to build Clio:
 | 
			
		||||
 | 
			
		||||
| Compiler    | Version |
 | 
			
		||||
| ----------- | ------- |
 | 
			
		||||
| GCC         | 12.3    |
 | 
			
		||||
| Clang       | 16      |
 | 
			
		||||
| Apple Clang | 15      |
 | 
			
		||||
| GCC         | 15.2    |
 | 
			
		||||
| Clang       | 19      |
 | 
			
		||||
| Apple Clang | 17      |
 | 
			
		||||
 | 
			
		||||
### Conan Configuration
 | 
			
		||||
 | 
			
		||||
Clio requires `compiler.cppstd=20` in your Conan profile (`~/.conan/profiles/default`).
 | 
			
		||||
By default, Conan uses `~/.conan2` as it's home folder.
 | 
			
		||||
You can change it by using `$CONAN_HOME` env variable.
 | 
			
		||||
[More info about Conan home](https://docs.conan.io/2/reference/environment.html#conan-home).
 | 
			
		||||
 | 
			
		||||
> [!NOTE]
 | 
			
		||||
> Although Clio is built using C++23, it's required to set `compiler.cppstd=20` for the time being as some of Clio's dependencies are not yet capable of building under C++23.
 | 
			
		||||
> [!TIP]
 | 
			
		||||
> To setup Conan automatically, you can run `.github/scripts/conan/init.sh`.
 | 
			
		||||
> This will delete Conan home directory (if it exists), set up profiles and add Artifactory remote.
 | 
			
		||||
 | 
			
		||||
**Mac example**:
 | 
			
		||||
The instruction below assumes that `$CONAN_HOME` is not set.
 | 
			
		||||
 | 
			
		||||
#### Profiles
 | 
			
		||||
 | 
			
		||||
The default profile is the file in `~/.conan2/profiles/default`.
 | 
			
		||||
 | 
			
		||||
Here are some examples of possible profiles:
 | 
			
		||||
 | 
			
		||||
**Mac apple-clang 17 example**:
 | 
			
		||||
 | 
			
		||||
```text
 | 
			
		||||
[settings]
 | 
			
		||||
os=Macos
 | 
			
		||||
os_build=Macos
 | 
			
		||||
arch=armv8
 | 
			
		||||
arch_build=armv8
 | 
			
		||||
compiler=apple-clang
 | 
			
		||||
compiler.version=15
 | 
			
		||||
compiler.libcxx=libc++
 | 
			
		||||
arch={{detect_api.detect_arch()}}
 | 
			
		||||
build_type=Release
 | 
			
		||||
compiler=apple-clang
 | 
			
		||||
compiler.cppstd=20
 | 
			
		||||
compiler.libcxx=libc++
 | 
			
		||||
compiler.version=17
 | 
			
		||||
os=Macos
 | 
			
		||||
 | 
			
		||||
[conf]
 | 
			
		||||
tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]
 | 
			
		||||
grpc/1.50.1:tools.build:cxxflags+=["-Wno-missing-template-arg-list-after-template-kw"]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Linux example**:
 | 
			
		||||
**Linux gcc-12 example**:
 | 
			
		||||
 | 
			
		||||
```text
 | 
			
		||||
[settings]
 | 
			
		||||
os=Linux
 | 
			
		||||
os_build=Linux
 | 
			
		||||
arch=x86_64
 | 
			
		||||
arch_build=x86_64
 | 
			
		||||
compiler=gcc
 | 
			
		||||
compiler.version=12
 | 
			
		||||
compiler.libcxx=libstdc++11
 | 
			
		||||
arch={{detect_api.detect_arch()}}
 | 
			
		||||
build_type=Release
 | 
			
		||||
compiler=gcc
 | 
			
		||||
compiler.cppstd=20
 | 
			
		||||
compiler.libcxx=libstdc++11
 | 
			
		||||
compiler.version=12
 | 
			
		||||
os=Linux
 | 
			
		||||
 | 
			
		||||
[conf]
 | 
			
		||||
tools.build:compiler_executables={"c": "/usr/bin/gcc-12", "cpp": "/usr/bin/g++-12"}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
> [!NOTE]
 | 
			
		||||
> Although Clio is built using C++23, it's required to set `compiler.cppstd=20` in your profile for the time being as some of Clio's dependencies are not yet capable of building under C++23.
 | 
			
		||||
 | 
			
		||||
#### global.conf file
 | 
			
		||||
 | 
			
		||||
To increase the speed of downloading and uploading packages, add the following to the `~/.conan2/global.conf` file:
 | 
			
		||||
 | 
			
		||||
```text
 | 
			
		||||
core.download:parallel={{os.cpu_count()}}
 | 
			
		||||
core.upload:parallel={{os.cpu_count()}}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Artifactory
 | 
			
		||||
@@ -61,84 +90,114 @@ compiler.cppstd=20
 | 
			
		||||
Make sure artifactory is setup with Conan.
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
conan remote add --insert 0 conan-non-prod http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
 | 
			
		||||
conan remote add --index 0 xrplf https://conan.ripplex.io
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Now you should be able to download the prebuilt `xrpl` package on some platforms.
 | 
			
		||||
Now you should be able to download the prebuilt dependencies (including `xrpl` package) on supported platforms.
 | 
			
		||||
 | 
			
		||||
#### Conan lockfile
 | 
			
		||||
 | 
			
		||||
To achieve reproducible dependencies, we use [Conan lockfile](https://docs.conan.io/2/tutorial/versioning/lockfiles.html).
 | 
			
		||||
 | 
			
		||||
The `conan.lock` file in the repository contains a "snapshot" of the current dependencies.
 | 
			
		||||
It is implicitly used when running `conan` commands, you don't need to specify it.
 | 
			
		||||
 | 
			
		||||
You have to update this file every time you add a new dependency or change a revision or version of an existing dependency.
 | 
			
		||||
 | 
			
		||||
> [!NOTE]
 | 
			
		||||
> You may need to edit the `~/.conan/remotes.json` file to ensure that this newly added artifactory is listed last. Otherwise, you could see compilation errors when building the project with gcc version 13 (or newer).
 | 
			
		||||
> Conan uses local cache by default when creating a lockfile.
 | 
			
		||||
>
 | 
			
		||||
> To ensure, that lockfile creation works the same way on all developer machines, you should clear the local cache before creating a new lockfile.
 | 
			
		||||
 | 
			
		||||
Remove old packages you may have cached.
 | 
			
		||||
To create a new lockfile, run the following commands in the repository root:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
conan remove -f xrpl
 | 
			
		||||
```bash
 | 
			
		||||
conan remove '*' --confirm
 | 
			
		||||
rm conan.lock
 | 
			
		||||
# This ensure that xrplf remote is the first to be consulted
 | 
			
		||||
conan remote add --force --index 0 xrplf https://conan.ripplex.io
 | 
			
		||||
conan lock create .
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
> [!NOTE]
 | 
			
		||||
> If some dependencies are exclusive for some OS, you may need to run the last command for them adding `--profile:all <PROFILE>`.
 | 
			
		||||
 | 
			
		||||
## Building Clio
 | 
			
		||||
 | 
			
		||||
Navigate to Clio's root directory and run:
 | 
			
		||||
1. Navigate to Clio's root directory and run:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
mkdir build && cd build
 | 
			
		||||
conan install .. --output-folder . --build missing --settings build_type=Release -o tests=True
 | 
			
		||||
# You can also add -GNinja to use Ninja build system instead of Make
 | 
			
		||||
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
 | 
			
		||||
cmake --build . --parallel 8 # or without the number if you feel extra adventurous
 | 
			
		||||
```
 | 
			
		||||
   ```sh
 | 
			
		||||
   mkdir build && cd build
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
> [!TIP]
 | 
			
		||||
> You can omit the `-o tests=True` if you don't want to build `clio_tests`.
 | 
			
		||||
2. Install dependencies through conan.
 | 
			
		||||
 | 
			
		||||
If successful, `conan install` will find the required packages and `cmake` will do the rest. You should see `clio_server` and `clio_tests` in the `build` directory (the current directory).
 | 
			
		||||
   ```sh
 | 
			
		||||
   conan install .. --output-folder . --build missing --settings build_type=Release
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
> [!TIP]
 | 
			
		||||
> To generate a Code Coverage report, include `-o coverage=True` in the `conan install` command above, along with `-o tests=True` to enable tests. After running the `cmake` commands, execute `make clio_tests-ccov`. The coverage report will be found at `clio_tests-llvm-cov/index.html`.
 | 
			
		||||
   > You can add `--profile:all <PROFILE_NAME>` to choose a specific conan profile.
 | 
			
		||||
 | 
			
		||||
<!-- markdownlint-disable-line MD028 -->
 | 
			
		||||
3. Configure and generate build files with CMake.
 | 
			
		||||
 | 
			
		||||
   ```sh
 | 
			
		||||
   cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
   > You can add `-GNinja` to use the Ninja build system (instead of Make).
 | 
			
		||||
 | 
			
		||||
4. Now, you can build all targets or specific ones:
 | 
			
		||||
 | 
			
		||||
   ```sh
 | 
			
		||||
   # builds all targets
 | 
			
		||||
   cmake --build . --parallel 8
 | 
			
		||||
   # builds only clio_server target
 | 
			
		||||
   cmake --build . --parallel 8 --target clio_server
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
   You should see `clio_server` and `clio_tests` in the current directory.
 | 
			
		||||
 | 
			
		||||
> [!NOTE]
 | 
			
		||||
> If you've built Clio before and the build is now failing, it's likely due to updated dependencies. Try deleting the build folder and then rerunning the Conan and CMake commands mentioned above.
 | 
			
		||||
 | 
			
		||||
### CMake options
 | 
			
		||||
 | 
			
		||||
There are several CMake options you can use to customize the build:
 | 
			
		||||
 | 
			
		||||
| CMake Option          | Default | CMake Target                                             | Description                           |
 | 
			
		||||
| --------------------- | ------- | -------------------------------------------------------- | ------------------------------------- |
 | 
			
		||||
| `-Dcoverage`          | OFF     | `clio_tests-ccov`                                        | Enables code coverage generation      |
 | 
			
		||||
| `-Dtests`             | OFF     | `clio_tests`                                             | Enables unit tests                    |
 | 
			
		||||
| `-Dintegration_tests` | OFF     | `clio_integration_tests`                                 | Enables integration tests             |
 | 
			
		||||
| `-Dbenchmark`         | OFF     | `clio_benchmark`                                         | Enables benchmark executable          |
 | 
			
		||||
| `-Ddocs`              | OFF     | `docs`                                                   | Enables API documentation generation  |
 | 
			
		||||
| `-Dlint`              | OFF     | See [#clang-tidy](#using-clang-tidy-for-static-analysis) | Enables `clang-tidy` static analysis  |
 | 
			
		||||
| `-Dsan`               | N/A     | N/A                                                      | Enables Sanitizer (asan, tsan, ubsan) |
 | 
			
		||||
| `-Dpackage`           | OFF     | N/A                                                      | Creates a debian package              |
 | 
			
		||||
 | 
			
		||||
### Generating API docs for Clio
 | 
			
		||||
 | 
			
		||||
The API documentation for Clio is generated by [Doxygen](https://www.doxygen.nl/index.html). If you want to generate the API documentation when building Clio, make sure to install Doxygen 1.12.0 on your system.
 | 
			
		||||
The API documentation for Clio is generated by [Doxygen](https://www.doxygen.nl/index.html). If you want to generate the API documentation when building Clio, make sure to install Doxygen 1.14.0 on your system.
 | 
			
		||||
 | 
			
		||||
To generate the API docs:
 | 
			
		||||
To generate the API docs, please use CMake option `-Ddocs=ON` as described above and build the `docs` target.
 | 
			
		||||
 | 
			
		||||
1. First, include `-o docs=True` in the conan install command. For example:
 | 
			
		||||
To view the generated files, go to `build/docs/html`.
 | 
			
		||||
Open the `index.html` file in your browser to see the documentation pages.
 | 
			
		||||
 | 
			
		||||
   ```sh
 | 
			
		||||
   mkdir build && cd build
 | 
			
		||||
   conan install .. --output-folder . --build missing --settings build_type=Release -o tests=True -o docs=True
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
2. Once that has completed successfully, run the `cmake` command and add the `--target docs` option:
 | 
			
		||||
 | 
			
		||||
   ```sh
 | 
			
		||||
   cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
 | 
			
		||||
   cmake --build . --parallel 8 --target docs
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
3. Go to `build/docs/html` to view the generated files.
 | 
			
		||||
 | 
			
		||||
   Open the `index.html` file in your browser to see the documentation pages.
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
## Building Clio with Docker
 | 
			
		||||
 | 
			
		||||
It is also possible to build Clio using [Docker](https://www.docker.com/) if you don't want to install all the dependencies on your machine.
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
docker run -it ghcr.io/xrplf/clio-ci:latest
 | 
			
		||||
docker run -it ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
git clone https://github.com/XRPLF/clio
 | 
			
		||||
mkdir build && cd build
 | 
			
		||||
conan install .. --output-folder . --build missing --settings build_type=Release -o tests=True
 | 
			
		||||
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release ..
 | 
			
		||||
cmake --build . --parallel 8 # or without the number if you feel extra adventurous
 | 
			
		||||
cd clio
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Follow the same steps in the [Building Clio](#building-clio) section. You can use `--profile:all gcc` or `--profile:all clang` with the `conan install` command to choose the desired compiler.
 | 
			
		||||
 | 
			
		||||
## Developing against `rippled` in standalone mode
 | 
			
		||||
 | 
			
		||||
If you wish to develop against a `rippled` instance running in standalone mode there are a few quirks of both Clio and `rippled` that you need to keep in mind. You must:
 | 
			
		||||
@@ -150,24 +209,24 @@ If you wish to develop against a `rippled` instance running in standalone mode t
 | 
			
		||||
 | 
			
		||||
Sometimes, during development, you need to build against a custom version of `libxrpl`. (For example, you may be developing compatibility for a proposed amendment that is not yet merged to the main `rippled` codebase.) To build Clio with compatibility for a custom fork or branch of `rippled`, follow these steps:
 | 
			
		||||
 | 
			
		||||
1. First, pull/clone the appropriate `rippled` fork and switch to the branch you want to build.
 | 
			
		||||
   The following example uses an in-development build with [XLS-33d Multi-Purpose Tokens](https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0033d-multi-purpose-tokens):
 | 
			
		||||
1. First, pull/clone the appropriate `rippled` version and switch to the branch you want to build.
 | 
			
		||||
   The following example uses a `2.5.0-rc1` tag of rippled in the main branch:
 | 
			
		||||
 | 
			
		||||
   ```sh
 | 
			
		||||
   git clone https://github.com/shawnxie999/rippled/
 | 
			
		||||
   git clone https://github.com/XRPLF/rippled/
 | 
			
		||||
   cd rippled
 | 
			
		||||
   git switch mpt-1.1
 | 
			
		||||
   git checkout 2.5.0-rc1
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
2. Export a custom package to your local Conan store using a user/channel:
 | 
			
		||||
 | 
			
		||||
   ```sh
 | 
			
		||||
   conan export . my/feature
 | 
			
		||||
   conan export . --user=my --channel=feature
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
3. Patch your local Clio build to use the right package.
 | 
			
		||||
 | 
			
		||||
   Edit `conanfile.py` (from the Clio repository root). Replace the `xrpl` requirement with the custom package version from the previous step. This must also include the current version number from your `rippled` branch. For example:
 | 
			
		||||
   Edit `conanfile.py` in the Clio repository root. Replace the `xrpl` requirement with the custom package version from the previous step. This must also include the current version number from your `rippled` branch. For example:
 | 
			
		||||
 | 
			
		||||
   ```py
 | 
			
		||||
   # ... (excerpt from conanfile.py)
 | 
			
		||||
@@ -178,7 +237,7 @@ Sometimes, during development, you need to build against a custom version of `li
 | 
			
		||||
       'protobuf/3.21.9',
 | 
			
		||||
       'grpc/1.50.1',
 | 
			
		||||
       'openssl/1.1.1v',
 | 
			
		||||
       'xrpl/2.3.0-b1@my/feature', # Update this line
 | 
			
		||||
       'xrpl/2.5.0-rc1@my/feature', # Use your exported version here
 | 
			
		||||
       'zlib/1.3.1',
 | 
			
		||||
       'libbacktrace/cci.20210118'
 | 
			
		||||
   ]
 | 
			
		||||
@@ -190,17 +249,16 @@ Sometimes, during development, you need to build against a custom version of `li
 | 
			
		||||
 | 
			
		||||
## Using `clang-tidy` for static analysis
 | 
			
		||||
 | 
			
		||||
The minimum [clang-tidy](https://clang.llvm.org/extra/clang-tidy/) version required is 19.0.
 | 
			
		||||
 | 
			
		||||
Clang-tidy can be run by CMake when building the project. To achieve this, you just need to provide the option `-o lint=True` for the `conan install` command:
 | 
			
		||||
Clang-tidy can be run by CMake when building the project.
 | 
			
		||||
To achieve this, you just need to provide the option `-Dlint=ON` when generating CMake files:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
conan install .. --output-folder . --build missing --settings build_type=Release -o tests=True -o lint=True
 | 
			
		||||
cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -Dlint=ON ..
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
By default CMake will try to find `clang-tidy` automatically in your system.
 | 
			
		||||
To force CMake to use your desired binary, set the `CLIO_CLANG_TIDY_BIN` environment variable to the path of the `clang-tidy` binary. For example:
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
export CLIO_CLANG_TIDY_BIN=/opt/homebrew/opt/llvm@19/bin/clang-tidy
 | 
			
		||||
export CLIO_CLANG_TIDY_BIN=/opt/homebrew/opt/llvm/bin/clang-tidy
 | 
			
		||||
```
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,9 @@
 | 
			
		||||
This document provides a list of all available Clio configuration properties in detail.
 | 
			
		||||
 | 
			
		||||
> [!NOTE]
 | 
			
		||||
> Dot notation in configuration key names represents nested fields. For example, **database.scylladb** refers to the _scylladb_ field inside the _database_ object. If a key name includes "[]", it indicates that the nested field is an array (e.g., etl_sources.[]).
 | 
			
		||||
> Dot notation in configuration key names represents nested fields.
 | 
			
		||||
> For example, **database.scylladb** refers to the _scylladb_ field inside the _database_ object.
 | 
			
		||||
> If a key name includes "[]", it indicates that the nested field is an array (e.g., etl_sources.[]).
 | 
			
		||||
 | 
			
		||||
## Configuration Details
 | 
			
		||||
 | 
			
		||||
@@ -87,6 +89,14 @@ This document provides a list of all available Clio configuration properties in
 | 
			
		||||
- **Constraints**: The minimum value is `1`. The maximum value is `4294967295`.
 | 
			
		||||
- **Description**: Represents the number of threads that will be used for database operations.
 | 
			
		||||
 | 
			
		||||
### database.cassandra.provider
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: string
 | 
			
		||||
- **Default value**: `cassandra`
 | 
			
		||||
- **Constraints**: The value must be one of the following: `cassandra`, `aws_keyspace`.
 | 
			
		||||
- **Description**: The specific database backend provider we are using.
 | 
			
		||||
 | 
			
		||||
### database.cassandra.core_connections_per_host
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
@@ -155,7 +165,7 @@ This document provides a list of all available Clio configuration properties in
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: boolean
 | 
			
		||||
- **Default value**: `True`
 | 
			
		||||
- **Default value**: `False`
 | 
			
		||||
- **Constraints**: None
 | 
			
		||||
- **Description**: If set to `True`, allows Clio to start without any ETL source.
 | 
			
		||||
 | 
			
		||||
@@ -327,11 +337,27 @@ This document provides a list of all available Clio configuration properties in
 | 
			
		||||
- **Constraints**: The minimum value is `1`. The maximum value is `4294967295`.
 | 
			
		||||
- **Description**: Maximum queue size for sending subscription data to clients. This queue buffers data when a client is slow to receive it, ensuring delivery once the client is ready.
 | 
			
		||||
 | 
			
		||||
### server.proxy.ips.[]
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: string
 | 
			
		||||
- **Default value**: None
 | 
			
		||||
- **Constraints**: None
 | 
			
		||||
- **Description**: List of proxy ip addresses. When Clio receives a request from proxy it will use `Forwarded` value (if any) as client ip. When this option is used together with `server.proxy.tokens` Clio will identify proxy by ip or by token.
 | 
			
		||||
 | 
			
		||||
### server.proxy.tokens.[]
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: string
 | 
			
		||||
- **Default value**: None
 | 
			
		||||
- **Constraints**: None
 | 
			
		||||
- **Description**: List of tokens in identifying request as a request from proxy. Token should be provided in `X-Proxy-Token` header, e.g. `X-Proxy-Token: <very_secret_token>'. When Clio receives a request from proxy it will use 'Forwarded` value (if any) to get client ip. When this option is used together with 'server.proxy.ips' Clio will identify proxy by ip or by token.
 | 
			
		||||
 | 
			
		||||
### prometheus.enabled
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: boolean
 | 
			
		||||
- **Default value**: `False`
 | 
			
		||||
- **Default value**: `True`
 | 
			
		||||
- **Constraints**: None
 | 
			
		||||
- **Description**: Enables or disables Prometheus metrics.
 | 
			
		||||
 | 
			
		||||
@@ -339,7 +365,7 @@ This document provides a list of all available Clio configuration properties in
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: boolean
 | 
			
		||||
- **Default value**: `False`
 | 
			
		||||
- **Default value**: `True`
 | 
			
		||||
- **Constraints**: None
 | 
			
		||||
- **Description**: Enables or disables compression of Prometheus responses.
 | 
			
		||||
 | 
			
		||||
@@ -415,7 +441,7 @@ This document provides a list of all available Clio configuration properties in
 | 
			
		||||
- **Constraints**: The value must be one of the following: `sync`, `async`, `none`.
 | 
			
		||||
- **Description**: The strategy used for Cache loading.
 | 
			
		||||
 | 
			
		||||
### log_channels.[].channel
 | 
			
		||||
### log.channels.[].channel
 | 
			
		||||
 | 
			
		||||
- **Required**: False
 | 
			
		||||
- **Type**: string
 | 
			
		||||
@@ -423,39 +449,63 @@ This document provides a list of all available Clio configuration properties in
 | 
			
		||||
- **Constraints**: The value must be one of the following: `General`, `WebServer`, `Backend`, `RPC`, `ETL`, `Subscriptions`, `Performance`, `Migration`.
 | 
			
		||||
- **Description**: The name of the log channel.
 | 
			
		||||
 | 
			
		||||
### log_channels.[].log_level
 | 
			
		||||
### log.channels.[].level
 | 
			
		||||
 | 
			
		||||
- **Required**: False
 | 
			
		||||
- **Type**: string
 | 
			
		||||
- **Default value**: None
 | 
			
		||||
- **Constraints**: The value must be one of the following: `trace`, `debug`, `info`, `warning`, `error`, `fatal`, `count`.
 | 
			
		||||
- **Constraints**: The value must be one of the following: `trace`, `debug`, `info`, `warning`, `error`, `fatal`.
 | 
			
		||||
- **Description**: The log level for the specific log channel.
 | 
			
		||||
 | 
			
		||||
### log_level
 | 
			
		||||
### log.level
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: string
 | 
			
		||||
- **Default value**: `info`
 | 
			
		||||
- **Constraints**: The value must be one of the following: `trace`, `debug`, `info`, `warning`, `error`, `fatal`, `count`.
 | 
			
		||||
- **Constraints**: The value must be one of the following: `trace`, `debug`, `info`, `warning`, `error`, `fatal`.
 | 
			
		||||
- **Description**: The general logging level of Clio. This level is applied to all log channels that do not have an explicitly defined logging level.
 | 
			
		||||
 | 
			
		||||
### log_format
 | 
			
		||||
### log.format
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: string
 | 
			
		||||
- **Default value**: `%TimeStamp% (%SourceLocation%) [%ThreadID%] %Channel%:%Severity% %Message%`
 | 
			
		||||
- **Default value**: `%Y-%m-%d %H:%M:%S.%f %^%3!l:%n%$ - %v`
 | 
			
		||||
- **Constraints**: None
 | 
			
		||||
- **Description**: The format string for log messages. The format is described here: <https://www.boost.org/doc/libs/1_83_0/libs/log/doc/html/log/tutorial/formatters.html>.
 | 
			
		||||
- **Description**: The format string for log messages using spdlog format patterns.
 | 
			
		||||
 | 
			
		||||
### log_to_console
 | 
			
		||||
Each of the variables expands like so:
 | 
			
		||||
 | 
			
		||||
- `%Y-%m-%d %H:%M:%S.%f`: The full date and time of the log entry with microsecond precision
 | 
			
		||||
- `%^`: Start color range
 | 
			
		||||
- `%3!l`: The severity (aka log level) the entry was sent at stripped to 3 characters
 | 
			
		||||
- `%n`: The logger name (channel) that this log entry was sent to
 | 
			
		||||
- `%$`: End color range
 | 
			
		||||
- `%v`: The actual log message
 | 
			
		||||
 | 
			
		||||
Some additional variables that might be useful:
 | 
			
		||||
 | 
			
		||||
- `%@`: A partial path to the C++ file and the line number in the said file (`src/file/path:linenumber`)
 | 
			
		||||
- `%t`: The ID of the thread the log entry is written from
 | 
			
		||||
 | 
			
		||||
Documentation can be found at: <https://github.com/gabime/spdlog/wiki/Custom-formatting>.
 | 
			
		||||
 | 
			
		||||
### log.is_async
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: boolean
 | 
			
		||||
- **Default value**: `True`
 | 
			
		||||
- **Constraints**: None
 | 
			
		||||
- **Description**: Whether spdlog is asynchronous or not.
 | 
			
		||||
 | 
			
		||||
### log.enable_console
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: boolean
 | 
			
		||||
- **Default value**: `False`
 | 
			
		||||
- **Constraints**: None
 | 
			
		||||
- **Description**: Enables or disables logging to the console.
 | 
			
		||||
 | 
			
		||||
### log_directory
 | 
			
		||||
### log.directory
 | 
			
		||||
 | 
			
		||||
- **Required**: False
 | 
			
		||||
- **Type**: string
 | 
			
		||||
@@ -463,7 +513,7 @@ This document provides a list of all available Clio configuration properties in
 | 
			
		||||
- **Constraints**: None
 | 
			
		||||
- **Description**: The directory path for the log files.
 | 
			
		||||
 | 
			
		||||
### log_rotation_size
 | 
			
		||||
### log.rotation_size
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: int
 | 
			
		||||
@@ -471,23 +521,15 @@ This document provides a list of all available Clio configuration properties in
 | 
			
		||||
- **Constraints**: The minimum value is `1`. The maximum value is `4294967295`.
 | 
			
		||||
- **Description**: The log rotation size in megabytes. When the log file reaches this particular size, a new log file starts.
 | 
			
		||||
 | 
			
		||||
### log_directory_max_size
 | 
			
		||||
### log.directory_max_files
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: int
 | 
			
		||||
- **Default value**: `51200`
 | 
			
		||||
- **Default value**: `25`
 | 
			
		||||
- **Constraints**: The minimum value is `1`. The maximum value is `4294967295`.
 | 
			
		||||
- **Description**: The maximum size of the log directory in megabytes.
 | 
			
		||||
- **Description**: The maximum number of log files in the directory.
 | 
			
		||||
 | 
			
		||||
### log_rotation_hour_interval
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: int
 | 
			
		||||
- **Default value**: `12`
 | 
			
		||||
- **Constraints**: The minimum value is `1`. The maximum value is `4294967295`.
 | 
			
		||||
- **Description**: Represents the interval (in hours) for log rotation. If the current log file reaches this value in logging, a new log file starts.
 | 
			
		||||
 | 
			
		||||
### log_tag_style
 | 
			
		||||
### log.tag_style
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: string
 | 
			
		||||
@@ -507,7 +549,7 @@ This document provides a list of all available Clio configuration properties in
 | 
			
		||||
 | 
			
		||||
- **Required**: True
 | 
			
		||||
- **Type**: boolean
 | 
			
		||||
- **Default value**: `True`
 | 
			
		||||
- **Default value**: `False`
 | 
			
		||||
- **Constraints**: None
 | 
			
		||||
- **Description**: Indicates if the server is allowed to write data to the database.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@
 | 
			
		||||
Clio needs access to a `rippled` server in order to work. The following configurations are required for Clio and `rippled` to communicate:
 | 
			
		||||
 | 
			
		||||
1. In the Clio config file, provide the following:
 | 
			
		||||
 | 
			
		||||
   - The IP of the `rippled` server
 | 
			
		||||
 | 
			
		||||
   - The port on which `rippled` is accepting unencrypted WebSocket connections
 | 
			
		||||
@@ -13,7 +12,6 @@ Clio needs access to a `rippled` server in order to work. The following configur
 | 
			
		||||
   - The port on which `rippled` is handling gRPC requests
 | 
			
		||||
 | 
			
		||||
2. In the `rippled` config file, you need to open:
 | 
			
		||||
 | 
			
		||||
   - A port to accept unencrypted WebSocket connections
 | 
			
		||||
 | 
			
		||||
   - A port to handle gRPC requests, with the IP(s) of Clio specified in the `secure_gateway` entry
 | 
			
		||||
@@ -90,13 +88,15 @@ Exactly equal password gains admin rights for the request or a websocket connect
 | 
			
		||||
Clio can cache requests to ETL sources to reduce the load on the ETL source.
 | 
			
		||||
Only following commands are cached: `server_info`, `server_state`, `server_definitions`, `fee`, `ledger_closed`.
 | 
			
		||||
By default the forwarding cache is off.
 | 
			
		||||
To enable the caching for a source, `forwarding_cache_timeout` value should be added to the configuration file, e.g.:
 | 
			
		||||
To enable the caching for a source, `forwarding.cache_timeout` value should be added to the configuration file, e.g.:
 | 
			
		||||
 | 
			
		||||
```json
 | 
			
		||||
"forwarding_cache_timeout": 0.250,
 | 
			
		||||
"forwarding": {
 | 
			
		||||
    "cache_timeout": 0.250,
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
`forwarding_cache_timeout` defines for how long (in seconds) a cache entry will be valid after being placed into the cache.
 | 
			
		||||
`forwarding.cache_timeout` defines for how long (in seconds) a cache entry will be valid after being placed into the cache.
 | 
			
		||||
Zero value turns off the cache feature.
 | 
			
		||||
 | 
			
		||||
## Graceful shutdown (not fully implemented yet)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +1,10 @@
 | 
			
		||||
// SPDX-License-Identifier: MIT
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
Doxygen Awesome
 | 
			
		||||
https://github.com/jothepro/doxygen-awesome-css
 | 
			
		||||
 | 
			
		||||
MIT License
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2021 - 2023 jothepro
 | 
			
		||||
 | 
			
		||||
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", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
SOFTWARE.
 | 
			
		||||
Copyright (c) 2021 - 2025 jothepro
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,66 @@
 | 
			
		||||
// SPDX-License-Identifier: MIT
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
Doxygen Awesome
 | 
			
		||||
https://github.com/jothepro/doxygen-awesome-css
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2022 - 2025 jothepro
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
class DoxygenAwesomeFragmentCopyButton extends HTMLElement {
 | 
			
		||||
    constructor() {
 | 
			
		||||
        super();
 | 
			
		||||
        this.onclick=this.copyContent
 | 
			
		||||
    }
 | 
			
		||||
    static title = "Copy to clipboard"
 | 
			
		||||
    static copyIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M23.04,10.322c0,-2.582 -2.096,-4.678 -4.678,-4.678l-6.918,-0c-2.582,-0 -4.678,2.096 -4.678,4.678c0,-0 0,8.04 0,8.04c0,2.582 2.096,4.678 4.678,4.678c0,-0 6.918,-0 6.918,-0c2.582,-0 4.678,-2.096 4.678,-4.678c0,-0 0,-8.04 0,-8.04Zm-2.438,-0l-0,8.04c-0,1.236 -1.004,2.24 -2.24,2.24l-6.918,-0c-1.236,-0 -2.239,-1.004 -2.239,-2.24l-0,-8.04c-0,-1.236 1.003,-2.24 2.239,-2.24c0,0 6.918,0 6.918,0c1.236,0 2.24,1.004 2.24,2.24Z"/><path d="M5.327,16.748c-0,0.358 -0.291,0.648 -0.649,0.648c0,0 0,0 0,0c-2.582,0 -4.678,-2.096 -4.678,-4.678c0,0 0,-8.04 0,-8.04c0,-2.582 2.096,-4.678 4.678,-4.678l6.918,0c2.168,0 3.994,1.478 4.523,3.481c0.038,0.149 0.005,0.306 -0.09,0.428c-0.094,0.121 -0.239,0.191 -0.392,0.191c-0.451,0.005 -1.057,0.005 -1.457,0.005c-0.238,0 -0.455,-0.14 -0.553,-0.357c-0.348,-0.773 -1.128,-1.31 -2.031,-1.31c-0,0 -6.918,0 -6.918,0c-1.236,0 -2.24,1.004 -2.24,2.24l0,8.04c0,1.236 1.004,2.24 2.24,2.24l0,-0c0.358,-0 0.649,0.29 0.649,0.648c-0,0.353 -0,0.789 -0,1.142Z" style="fill-opacity:0.6;"/></svg>`
 | 
			
		||||
    static successIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M8.084,16.111c-0.09,0.09 -0.212,0.141 -0.34,0.141c-0.127,-0 -0.249,-0.051 -0.339,-0.141c-0.746,-0.746 -2.538,-2.538 -3.525,-3.525c-0.375,-0.375 -0.983,-0.375 -1.357,0c-0.178,0.178 -0.369,0.369 -0.547,0.547c-0.375,0.375 -0.375,0.982 -0,1.357c1.135,1.135 3.422,3.422 4.75,4.751c0.27,0.27 0.637,0.421 1.018,0.421c0.382,0 0.749,-0.151 1.019,-0.421c2.731,-2.732 10.166,-10.167 12.454,-12.455c0.375,-0.375 0.375,-0.982 -0,-1.357c-0.178,-0.178 -0.369,-0.369 -0.547,-0.547c-0.375,-0.375 -0.982,-0.375 -1.357,0c-2.273,2.273 -9.567,9.567 -11.229,11.229Z"/></svg>`
 | 
			
		||||
    static successDuration = 980
 | 
			
		||||
    static init() {
 | 
			
		||||
        $(function() {
 | 
			
		||||
            $(document).ready(function() {
 | 
			
		||||
                if(navigator.clipboard) {
 | 
			
		||||
                    const fragments = document.getElementsByClassName("fragment")
 | 
			
		||||
                    for(const fragment of fragments) {
 | 
			
		||||
                        const fragmentWrapper = document.createElement("div")
 | 
			
		||||
                        fragmentWrapper.className = "doxygen-awesome-fragment-wrapper"
 | 
			
		||||
                        const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button")
 | 
			
		||||
                        fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon
 | 
			
		||||
                        fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title
 | 
			
		||||
                
 | 
			
		||||
                        fragment.parentNode.replaceChild(fragmentWrapper, fragment)
 | 
			
		||||
                        fragmentWrapper.appendChild(fragment)
 | 
			
		||||
                        fragmentWrapper.appendChild(fragmentCopyButton)
 | 
			
		||||
            
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            })
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    copyContent() {
 | 
			
		||||
        const content = this.previousSibling.cloneNode(true)
 | 
			
		||||
        // filter out line number from file listings
 | 
			
		||||
        content.querySelectorAll(".lineno, .ttc").forEach((node) => {
 | 
			
		||||
            node.remove()
 | 
			
		||||
        })
 | 
			
		||||
        let textContent = content.textContent
 | 
			
		||||
        // remove trailing newlines that appear in file listings
 | 
			
		||||
        let numberOfTrailingNewlines = 0
 | 
			
		||||
        while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') {
 | 
			
		||||
            numberOfTrailingNewlines++;
 | 
			
		||||
        }
 | 
			
		||||
        textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines)
 | 
			
		||||
        navigator.clipboard.writeText(textContent);
 | 
			
		||||
        this.classList.add("success")
 | 
			
		||||
        this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon
 | 
			
		||||
        window.setTimeout(() => {
 | 
			
		||||
            this.classList.remove("success")
 | 
			
		||||
            this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon
 | 
			
		||||
        }, DoxygenAwesomeFragmentCopyButton.successDuration);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton)
 | 
			
		||||
@@ -1,29 +1,10 @@
 | 
			
		||||
// SPDX-License-Identifier: MIT
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
Doxygen Awesome
 | 
			
		||||
https://github.com/jothepro/doxygen-awesome-css
 | 
			
		||||
 | 
			
		||||
MIT License
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2022 - 2023 jothepro
 | 
			
		||||
 | 
			
		||||
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", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
SOFTWARE.
 | 
			
		||||
Copyright (c) 2022 - 2025 jothepro
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
@@ -55,9 +36,7 @@ class DoxygenAwesomeInteractiveToc {
 | 
			
		||||
                        headerNode: document.getElementById(id)
 | 
			
		||||
                    })
 | 
			
		||||
 | 
			
		||||
                    document.getElementById("doc-content")?.addEventListener("scroll", () => {
 | 
			
		||||
                        DoxygenAwesomeInteractiveToc.update()
 | 
			
		||||
                    })
 | 
			
		||||
                    document.getElementById("doc-content")?.addEventListener("scroll",this.throttle(DoxygenAwesomeInteractiveToc.update, 100))
 | 
			
		||||
                })
 | 
			
		||||
                DoxygenAwesomeInteractiveToc.update()
 | 
			
		||||
            }
 | 
			
		||||
@@ -78,4 +57,16 @@ class DoxygenAwesomeInteractiveToc {
 | 
			
		||||
        active?.classList.add("active")
 | 
			
		||||
        active?.classList.remove("aboveActive")
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    static throttle(func, delay) {
 | 
			
		||||
        let lastCall = 0;
 | 
			
		||||
        return function (...args) {
 | 
			
		||||
            const now = new Date().getTime();
 | 
			
		||||
            if (now - lastCall < delay) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            lastCall = now;
 | 
			
		||||
            return setTimeout(() => {func(...args)}, delay);
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,30 +1,10 @@
 | 
			
		||||
 | 
			
		||||
/* SPDX-License-Identifier: MIT */
 | 
			
		||||
/**
 | 
			
		||||
 | 
			
		||||
Doxygen Awesome
 | 
			
		||||
https://github.com/jothepro/doxygen-awesome-css
 | 
			
		||||
 | 
			
		||||
MIT License
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2021 - 2023 jothepro
 | 
			
		||||
 | 
			
		||||
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", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
SOFTWARE.
 | 
			
		||||
Copyright (c) 2021 - 2025 jothepro
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user