depends: cleanup package configure flags #16370

pull fanquake wants to merge 6 commits into bitcoin:master from fanquake:not_so_great_configure_cleanup changing 6 files +11 −6
  1. fanquake commented at 2:54 am on July 11, 2019: member

    Related to #16354.

    This PR adds additional configure flags to packages in depends to explicitly disable features we aren’t using; similar to #16183. It also fixes passing --without-tools to qrencode.

    I’ve added --disable-drafts to zeromq:

    0Build and install draft classes and methods [default=yes]
    

    I’m not entirely sure how far we want to take this. i.e in the zeromq package we explicitly pass --without-libsodium, even though it’s disabled by default.

    Do we also want to explicitly pass all the other --without flags? :

    0  --with-libgssapi_krb5   require libzmq build with libgssapi_krb5
    1                          [default=no]
    2  --with-libsodium        use libsodium instead of built-in tweetnacl
    3                          [default=no]
    4  --with-pgm              build libzmq with PGM extension. Requires pkg-config
    5                          [default=no]
    6  --with-norm             build libzmq with NORM protocol extension,
    7                          optionally specifying norm path [default=no]
    8  --with-vmci             build libzmq with VMCI transport [default=no]
    
  2. fanquake added the label Build system on Jul 11, 2019
  3. fanquake requested review from dongcarl on Jul 11, 2019
  4. fanquake added the label Needs gitian build on Jul 11, 2019
  5. Sjors commented at 1:26 pm on July 11, 2019: member

    Less is more :-) I’m able to build and run QT on macOS 10.14.5 with 9a3e237. test/functional/interface_zmq.py passes.

    Explicitly passing all --without flags seems like a good idea; it means we don’t to worry about the upstream default changing and it’s also easier to reason about.

  6. DrahtBot removed the label Needs gitian build on Jul 12, 2019
  7. dongcarl commented at 6:37 pm on July 12, 2019: member

    Concept ACK. Looking at the DrahtBot logs, xproto and xextproto are both headers-only, so let’s remove --disable-shared from them!

    I think we should explicitly pass all --without flags… Silent behavioral changes are the worst kind.

  8. fanquake force-pushed on Jul 13, 2019
  9. fanquake added the label Needs gitian build on Jul 13, 2019
  10. practicalswift commented at 4:12 pm on July 13, 2019: contributor

    Concept ACK

    Compilation times before and after would be interesting to see.

    Nice cleanup regardless of compilation time impact though.

  11. DrahtBot removed the label Needs gitian build on Jul 14, 2019
  12. DrahtBot commented at 0:41 am on July 18, 2019: member

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    Conflicts

    No conflicts as of last run.

  13. fanquake force-pushed on Jul 23, 2019
  14. fanquake commented at 7:15 am on July 23, 2019: member
    Rebased for #16408.
  15. in depends/packages/fontconfig.mk:9 in 0d359bf555 outdated
     5@@ -6,7 +6,7 @@ $(package)_sha256_hash=b449a3e10c47e1d1c7a6ec6e2016cca73d3bd68fbbd4f0ae5cc6b573f
     6 $(package)_dependencies=freetype expat
     7 
     8 define $(package)_set_vars
     9-  $(package)_config_opts=--disable-docs --disable-static
    10+  $(package)_config_opts=--disable-docs --disable-static --disable-libxml2
    


    dongcarl commented at 3:32 pm on July 23, 2019:

    After inspecting the autoconf files, it seems that iconv is currently disabled and should probably be in the future as well.

    0  $(package)_config_opts=--disable-docs --disable-static --disable-libxml2 --disable-iconv
    

    fanquake commented at 5:57 am on July 24, 2019:
    Done.
  16. in depends/packages/qrencode.mk:8 in 0d359bf555 outdated
    4@@ -5,7 +5,7 @@ $(package)_file_name=$(package)-$($(package)_version).tar.bz2
    5 $(package)_sha256_hash=efe5188b1ddbcbf98763b819b146be6a90481aac30cfc8d858ab78a19cde1fa5
    6 
    7 define $(package)_set_vars
    8-$(package)_config_opts=--disable-shared -without-tools --disable-sdltest
    9+$(package)_config_opts=--disable-shared --without-tools --without-tests --disable-sdltest
    


    dongcarl commented at 4:03 pm on July 23, 2019:
    0$(package)_config_opts=--disable-shared --without-tools --without-tests --disable-sdltest --disable-gprof --disable-gcov --disable-mudflap --without-libiconv-prefix
    

    fanquake commented at 5:59 am on July 24, 2019:
    Done.

    theuni commented at 8:49 pm on July 31, 2019:
    Let’s not mix –without-libiconv-prefix into these changes, that’s just related to its search path. iconv is only used for the tests (which aren’t compiled) anyway.

    fanquake commented at 3:04 am on August 1, 2019:

    Updated to remove --without-libiconv-prefix. Docs:

    0--with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
    
  17. in depends/packages/zeromq.mk:9 in 0d359bf555 outdated
     5@@ -6,7 +6,8 @@ $(package)_sha256_hash=bcbabe1e2c7d0eec4ed612e10b94b112dd5f06fcefa994a0c79a45d83
     6 $(package)_patches=0001-fix-build-with-older-mingw64.patch 0002-disable-pthread_set_name_np.patch
     7 
     8 define $(package)_set_vars
     9-  $(package)_config_opts=--without-docs --disable-shared --without-libsodium --disable-curve --disable-curve-keygen --disable-perf --disable-Werror
    10+  $(package)_config_opts=--without-docs --disable-shared --disable-curve --disable-curve-keygen --disable-perf --disable-Werror --disable-drafts
    


    dongcarl commented at 5:11 pm on July 23, 2019:
    We can add: --disable-libunwind --disable-radix-tree --without-gcov --without-militant

    fanquake commented at 5:59 am on July 24, 2019:
    Done.

    theuni commented at 8:58 pm on July 31, 2019:
    0--with-militant         enable militant API assertions
    

    Disabling this (the current default) sounds like a safety downgrade…

  18. in depends/packages/libXau.mk:11 in 0d359bf555 outdated
     5@@ -6,7 +6,7 @@ $(package)_sha256_hash=fdd477320aeb5cdd67272838722d6b7d544887dfe7de46e1e7cc0c27c
     6 $(package)_dependencies=xproto
     7 
     8 define $(package)_set_vars
     9-  $(package)_config_opts=--disable-shared
    10+  $(package)_config_opts=--disable-shared --disable-lint-library --without-lint
    


    dongcarl commented at 5:27 pm on July 23, 2019:
    Nit: Took a look at --disable-xthreads in the autoconf files… It seems that it’s currently enabled. I’m not sure what the impact is of disabling it so we’ll leave it for now.

    fanquake commented at 5:58 am on July 24, 2019:
    Did you want to add a comment here somewhere, even just as a reminder in future if this package is updated / defaults change etc.

    dongcarl commented at 3:14 pm on July 30, 2019:
    Yeah a comment would be great for the future!

    fanquake commented at 7:13 am on July 31, 2019:
    Added a comment.
  19. in depends/packages/libxcb.mk:9 in 0d359bf555 outdated
     5@@ -6,7 +6,7 @@ $(package)_sha256_hash=98d9ab05b636dd088603b64229dd1ab2d2cc02ab807892e107d674f9c
     6 $(package)_dependencies=xcb_proto libXau
     7 
     8 define $(package)_set_vars
     9-$(package)_config_opts=--disable-static
    10+$(package)_config_opts=--disable-static --disable-build-docs --without-doxygen
    


    dongcarl commented at 5:30 pm on July 23, 2019:
    This is a candidate for another issue… It seems that we build all of the default XCB Extensions, but the -qt-xcb option we supply to QT might cause it to build them as well. (source: https://doc.qt.io/qt-5.9/linux-requirements.html)

    fanquake commented at 6:07 am on July 24, 2019:
    Opened an issue to track that: https://github.com/bitcoin/bitcoin/issues/16447

    theuni commented at 8:43 pm on July 31, 2019:
    Looks like we should set –without-launchd as well.

    fanquake commented at 3:02 am on August 1, 2019:

    Updated with --without-launchd. Docs are:

    0--with-launchd Build with support for Apple's launchd (default: auto)
    
  20. in depends/packages/xproto.mk:8 in 0d359bf555 outdated
    4@@ -5,7 +5,7 @@ $(package)_file_name=$(package)-$($(package)_version).tar.bz2
    5 $(package)_sha256_hash=636162c1759805a5a0114a369dffdeccb8af8c859ef6e1445f26a4e6e046514f
    6 
    7 define $(package)_set_vars
    8-$(package)_config_opts=--disable-shared
    9+$(package)_config_opts=--without-fop --without-xmlto --without-xsltproc
    


    dongcarl commented at 5:34 pm on July 23, 2019:
    Nit: Looking at https://gist.github.com/dongcarl/892d7deda8da3ff72317009ecbb07ffb#file-xproto-configure-help-L80-L90, I’m not sure what the specs and prototypes are… If anyone else knows please say so, otherwise we can leave it.

    fanquake commented at 6:04 am on July 24, 2019:

    From the looks of this mailing list post they are probably related to documentation generation?

    Document building enablement macros. This allows a builder to skip document generation if such documents are not desired. They should not be used to workaround tooling issues, use macros above. By default, building is enabled. The default value can be changed from configure.ac by invoking the macro like XORG_ENABLE_SPECS(no)

    XORG_ENABLE_DOCS ENABLE_DOCS General documentation XORG_ENABLE_DEVEL_DOCS ENABLE_DEVEL_DOCS More specifically developer’s documentation XORG_ENABLE_SPECS ENABLE_SPECS More specifically functional specifications


    dongcarl commented at 5:52 pm on July 30, 2019:
    Let’s just do --disable-specs, I was able to successfully do a guix build even with --disable-specs. You can put a comment there for the other flags or don’t, either way is fine :-)

    fanquake commented at 7:13 am on July 31, 2019:
    Updated with --disable-specs.
  21. in depends/packages/zeromq.mk:10 in 0d359bf555 outdated
     5@@ -6,7 +6,8 @@ $(package)_sha256_hash=bcbabe1e2c7d0eec4ed612e10b94b112dd5f06fcefa994a0c79a45d83
     6 $(package)_patches=0001-fix-build-with-older-mingw64.patch 0002-disable-pthread_set_name_np.patch
     7 
     8 define $(package)_set_vars
     9-  $(package)_config_opts=--without-docs --disable-shared --without-libsodium --disable-curve --disable-curve-keygen --disable-perf --disable-Werror
    10+  $(package)_config_opts=--without-docs --disable-shared --disable-curve --disable-curve-keygen --disable-perf --disable-Werror --disable-drafts
    11+  $(package)_config_opts += --without-libsodium --without-libgssapi_krb5 --without-pgm --without-norm --without-vmci
    


    dongcarl commented at 5:41 pm on July 23, 2019:
    Looking at https://gist.github.com/dongcarl/892d7deda8da3ff72317009ecbb07ffb#file-zeromq-configure-help-L114-L120, I’m reminded that after we’re able to use Guix for release builds, we will finally be able to, and definitely should specify what the minimal kernel headers are that we target for each architecture. We don’t want to target kernel headers that are too new, have the zeromq build auto-assume we have the fancy new ekquelect (not an actual thing) available, and then not be able to run on older kernels.

    fanquake commented at 6:10 am on July 24, 2019:
    Is this something you’d like to document here, or should we start tracking future Guix related improvements somewhere else? Depends how much there is to keep track of.

    dongcarl commented at 5:51 pm on July 30, 2019:
  22. dongcarl commented at 5:46 pm on July 23, 2019: member

    Much needed work, many thanks for starting it!

    I reviewed this PR with the help of this gist, which contains all the configure --help outputs of the packages you’ve touched here.

  23. dongcarl commented at 5:52 pm on July 23, 2019: member

    Thinking a little harder about our policy w/re configure flags here… I believe that our approach with these cleanups should be to explicitly disable as many features and packages as possible without changing Bitcoin Core’s functionality.

    Going forward, we can keep our builds sane by simply requiring (at review time) a diff of the configure --help output for every package version bump. We will change configure flags only to support new Bitcoin Core features or to disable new and unneeded features/packages for depends package version bumps.

  24. theuni commented at 6:04 pm on July 23, 2019: member

    @dongcarl I agree with the spirit of that idea, but I don’t think we should actually attempt to automate or codify.

    We need to be a little more surgical about this, imo. Remember that buildsystems are imperfect. An explicit “–without-foo” may accidentally produce a different result from an auto-detected missing “foo”. The most obvious example of this would be configuring Core with an explicit CXXFLAGS: “./configure CXXFLAGS="-O2 -g”. Being explicit there means clobbering the warnings and hardening that would’ve been added otherwise.

    tl;dr: Concept ACK, but let’s not go around flipping every switch we can find indiscriminately. Will review.

    Edit: Showing a diff of configure --help as part of a depends PR couldn’t possibly be a bad thing! I just think it’s a bit overkill as a requirement.

  25. fanquake force-pushed on Jul 24, 2019
  26. fanquake commented at 6:19 am on July 24, 2019: member

    tl;dr: Concept ACK, but let’s not go around flipping every switch we can find indiscriminately. Will review.

    Fair call. I’ve made some of the changes suggested by Carl above, and left some comments inline. I’ll leave this until you’ve done a first pass review.

    Showing a diff of configure –help as part of a depends PR couldn’t possibly be a bad thing!

    I think configure diffs are a nice idea, and at least they can be automated.

  27. laanwj referenced this in commit a54a12046e on Jul 25, 2019
  28. konez2k referenced this in commit 5e9dd64953 on Jul 27, 2019
  29. fanquake force-pushed on Jul 31, 2019
  30. in depends/packages/xproto.mk:8 in 173206c8b9 outdated
    4@@ -5,7 +5,7 @@ $(package)_file_name=$(package)-$($(package)_version).tar.bz2
    5 $(package)_sha256_hash=636162c1759805a5a0114a369dffdeccb8af8c859ef6e1445f26a4e6e046514f
    6 
    7 define $(package)_set_vars
    8-$(package)_config_opts=--disable-shared
    9+$(package)_config_opts=--without-fop --without-xmlto --without-xsltproc --disable-specs
    


    theuni commented at 8:51 pm on July 31, 2019:
    Doesn’t this install generated spec files? If so, does libXau not need them?
  31. theuni commented at 9:07 pm on July 31, 2019: member

    Left a few things to check.

    The --with-militant is the type of switch-flipping that makes me really nervous. Can we make sure that binary results don’t differ before/after these changes? IMO Anything that changes the bitcoind binary should be reviewed separately.

  32. fanquake force-pushed on Aug 1, 2019
  33. fanquake commented at 3:10 am on August 1, 2019: member

    I’ve addressed two of @theuni’s comments (libxcb and qrencode).

    For the remaining two, I’m adding some changes to our build-for-compare.py script so that you can pass a depends prefix through to configure. That should make it easier to do binary comparisons of depends changes. I’ll follow up with some comparisons of the --with-militant (zmq) changes shortly.

    Doesn’t this install generated spec files? If so, does libXau not need them?

    Still need to figure out and address this.

  34. laanwj referenced this in commit 1cd167e573 on Aug 1, 2019
  35. laanwj commented at 1:00 pm on August 1, 2019: member
    Concept ACK
  36. fanquake force-pushed on Aug 2, 2019
  37. fanquake commented at 1:27 am on August 2, 2019: member

    I’ve opened 1 more PR to the maintainer-tools repo that ensures we get deterministic bitcoin-qt builds.

    Disabling this (the current default) sounds like a safety downgrade…

    I agree, and have now removed that change.

    Passing --with-militant to zmqs ./configure (the default) defines ZMQ_ACT_MILITANT. Looking at the zeromq source, the usages of ZMQ_ACT_MILITANT are all in options.cpp. I’ve included some of the usage below:

    0static int sockopt_invalid ()
    1{
    2#if defined(ZMQ_ACT_MILITANT)
    3    zmq_assert (false);
    4#endif
    5    errno = EINVAL;
    6    return -1;
    7}
    
    0        default:
    1#if defined(ZMQ_ACT_MILITANT)
    2            //  There are valid scenarios for probing with unknown socket option
    3            //  values, e.g. to check if security is enabled or not. This will not
    4            //  provoke a militant assert. However, passing bad values to a valid
    5            //  socket option will, if ZMQ_ACT_MILITANT is defined.
    6            malformed = false;
    7#endif
    8            break;
    9    }
    
    0#if defined(ZMQ_ACT_MILITANT)
    1    //  There is no valid use case for passing an error back to the application
    2    //  when it sent malformed arguments to a socket option. Use ./configure
    3    //  --with-militant to enable this checking.
    4    if (malformed)
    5        zmq_assert (false);
    6#endif
    7    errno = EINVAL;
    8    return -1;
    9}
    

    FWIW the diff of the bitcoinds from a comparison build, one which had --without-militant passed to zeromq, is very large.

  38. laanwj referenced this in commit b49e7796c2 on Aug 14, 2019
  39. DrahtBot added the label Needs rebase on Aug 14, 2019
  40. DrahtBot commented at 12:09 pm on August 14, 2019: member
  41. depends: libXau: configure flags cleanup e439388b35
  42. depends: libxcb: configure flags cleanup e656d95ec7
  43. depends: fontconfig: configure flags cleanup 86beb8cdc4
  44. depends: qrencode: configure flags cleanup
    This also fixes passing --without-tools
    6a8ada3a4f
  45. depends: xproto: configure flags cleanup 0072237b9e
  46. depends: zeromq: disable draft classes and methods c295cba5a2
  47. fanquake force-pushed on Aug 14, 2019
  48. fanquake removed the label Needs rebase on Aug 14, 2019
  49. fanquake commented at 12:36 pm on August 14, 2019: member
    Rebased for #16533.
  50. MarcoFalke deleted a comment on Aug 14, 2019
  51. MarcoFalke deleted a comment on Aug 14, 2019
  52. MarcoFalke added the label Needs gitian build on Aug 14, 2019
  53. dongcarl commented at 7:00 pm on August 14, 2019: member
    @fanquake So the patchset as it stands right now does not change add the --with-militant flag, and thus the build-for-compare.py results are identical? I think this is merge-able, and we should deal with --with-militant in another PR/issue.
  54. fanquake commented at 9:57 am on August 15, 2019: member

    @dongcarl Yes I’m seeing identical results.

    I’ve just done another build-for-compare using the following (inside a Buster Docker container):

     0git fetch upstream pull/16370/head:16370 && git checkout 16370
     1
     2# build depends for c295cba5a2f934e51a7c8610ab4c58b8e9d56619
     3cd depends
     4RAPIDCHECK=1 make -j5
     5cd ..
     6
     7# build for compare into /tmp/c295cba5a2f934e51a7c8610ab4c58b8e9d56619
     8../bitcoin-maintainer-tools/build-for-compare.py c295cba5a2f934e51a7c8610ab4c58b8e9d56619  --prefix=/bitcoin/depends/x86_64-pc-linux-gnu --executables=src/bitcoind,src/qt/bitcoin-qt --parallelism=5 --tgtdir=/tmp/c295cba5a2f934e51a7c8610ab4c58b8e9d56619
     9
    10# jump back to last commit in the branch before the changes in this PR
    11git checkout 24f29790cd7e1001c0f923130ea24b18d378bbb5
    12
    13# re build depends
    14cd depends
    15RAPIDCHECK=1 make -j5
    16cd ..
    17
    18# build for compare into /tmp/24f29790cd7e1001c0f923130ea24b18d378bbb5
    19../bitcoin-maintainer-tools/build-for-compare.py 24f29790cd7e1001c0f923130ea24b18d378bbb5  --prefix=/bitcoin/depends/x86_64-pc-linux-gnu --executables=src/bitcoind,src/qt/bitcoin-qt --parallelism=5 --tgtdir=/tmp/24f29790cd7e1001c0f923130ea24b18d378bbb5
    20
    21# compare
    22shasum /tmp/24f29790cd7e1001c0f923130ea24b18d378bbb5/*.stripped /tmp/c295cba5a2f934e51a7c8610ab4c58b8e9d56619/*.stripped
    23a97c2d0626fa5b115b32c37604703aacc577845a  /tmp/24f29790cd7e1001c0f923130ea24b18d378bbb5/bitcoin-qt.24f29790cd7e1001c0f923130ea24b18d378bbb5.stripped
    247c78eb1760cf901f6dad7299ef6a270d73f3d52a  /tmp/24f29790cd7e1001c0f923130ea24b18d378bbb5/bitcoind.24f29790cd7e1001c0f923130ea24b18d378bbb5.stripped
    25a97c2d0626fa5b115b32c37604703aacc577845a  /tmp/c295cba5a2f934e51a7c8610ab4c58b8e9d56619/bitcoin-qt.c295cba5a2f934e51a7c8610ab4c58b8e9d56619.stripped
    267c78eb1760cf901f6dad7299ef6a270d73f3d52a  /tmp/c295cba5a2f934e51a7c8610ab4c58b8e9d56619/bitcoind.c295cba5a2f934e51a7c8610ab4c58b8e9d56619.stripped
    27
    28diffoscope 24f29790cd7e1001c0f923130ea24b18d378bbb5/bitcoin-qt.24f29790cd7e1001c0f923130ea24b18d378bbb5.stripped c295cba5a2f934e51a7c8610ab4c58b8e9d56619/bitcoin-qt.c295cba5a2f934e51a7c8610ab4c58b8e9d56619.stripped
    
  55. DrahtBot commented at 6:29 pm on August 16, 2019: member

    Gitian builds for commit a7aa809027633556dd3280c6e29ca98eb3235a3d (master):

    Gitian builds for commit f7d153905d3bf322a5dc900372b51b89438fdf18 (master and this pull):

  56. DrahtBot removed the label Needs gitian build on Aug 16, 2019
  57. dongcarl commented at 5:36 pm on August 20, 2019: member
    ACK c295cba5a2f934e51a7c8610ab4c58b8e9d56619
  58. Sjors commented at 7:07 pm on August 20, 2019: member
    c295cba still builds for me on macOS.
  59. meshcollider commented at 2:44 am on August 24, 2019: contributor
    Looks good to me, since dongcarl and theuni have both reviewed and the gitian build looks fine
  60. meshcollider referenced this in commit 3ca514ddb7 on Aug 24, 2019
  61. meshcollider merged this on Aug 24, 2019
  62. meshcollider closed this on Aug 24, 2019

  63. fanquake deleted the branch on Aug 24, 2019
  64. sidhujag referenced this in commit d89bdedbc5 on Aug 25, 2019
  65. deadalnix referenced this in commit 0823821a44 on Apr 2, 2020
  66. zkbot referenced this in commit e3d5ddbef4 on Oct 8, 2020
  67. zkbot referenced this in commit 6e4090d840 on Oct 8, 2020
  68. PastaPastaPasta referenced this in commit a42ac5713a on Jun 27, 2021
  69. PastaPastaPasta referenced this in commit acd870a77c on Jun 27, 2021
  70. PastaPastaPasta referenced this in commit 5694044819 on Jun 28, 2021
  71. PastaPastaPasta referenced this in commit 650dc04a4c on Jun 28, 2021
  72. PastaPastaPasta referenced this in commit b79dcdcc37 on Jun 29, 2021
  73. PastaPastaPasta referenced this in commit 4168b467d5 on Jun 29, 2021
  74. PastaPastaPasta referenced this in commit 0fb196d0c6 on Jul 1, 2021
  75. PastaPastaPasta referenced this in commit 76d59a737c on Jul 1, 2021
  76. PastaPastaPasta referenced this in commit 6d9db17449 on Jul 1, 2021
  77. PastaPastaPasta referenced this in commit 565a0c5748 on Jul 1, 2021
  78. PastaPastaPasta referenced this in commit d062deb53d on Jul 12, 2021
  79. PastaPastaPasta referenced this in commit 8a044ebc0e on Jul 12, 2021
  80. PastaPastaPasta referenced this in commit 7fcb8f53ed on Jul 13, 2021
  81. ftrader referenced this in commit 1612a624c9 on Aug 13, 2021
  82. PastaPastaPasta referenced this in commit 0af66e6574 on Sep 11, 2021
  83. PastaPastaPasta referenced this in commit 1b5d29bb9c on Sep 11, 2021
  84. Munkybooty referenced this in commit 97632ca890 on Nov 9, 2021
  85. Munkybooty referenced this in commit ccd976d600 on Nov 16, 2021
  86. Munkybooty referenced this in commit bf59b2ec92 on Nov 18, 2021
  87. Munkybooty referenced this in commit dcca9d8eb1 on Nov 24, 2021
  88. Munkybooty referenced this in commit 3e40a99573 on Nov 30, 2021
  89. Munkybooty referenced this in commit a9727f8c24 on Dec 15, 2021
  90. DrahtBot locked this on Dec 16, 2021

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-12-19 00:12 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me