Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

contrib: Enable building in Guix containers #15277

Merged
merged 4 commits into from Jul 12, 2019

Conversation

dongcarl
Copy link
Contributor

@dongcarl dongcarl commented Jan 28, 2019

This post is kept updated as this project progresses. Use this latest update link to see what's new.

Please read the README.md.


Guix Introduction

This PR enables building bitcoin in Guix containers. Guix is a transactional package manager much like Nix, but unlike Nix, it has more of a focus on bootstrappability and reproducibility which are attractive for security-sensitive projects like bitcoin.

Guix Build Walkthrough

Please read the README.md.

Old instructions no. 4

Old instructions no. 3

Old instructions no. 2

Old instructions no. 1 In this PR, we define a Guix [manifest](https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-package.html#profile_002dmanifest) in `contrib/guix/manifest.scm`, which declares what packages we want in our environment.

We can then invoke

guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes

To have Guix:

  1. Build an environment containing the packages we defined in our contrib/guix/manifest.scm manifest from the Guix bootstrap binaries (see bootstrappability for more details).
  2. Start a container with that environment that has no network access, and no access to the host's filesystem except to the pwd that it was started in.
  3. Drop you into a shell in that container.

Note: if you don't want to wait hours for Guix to build the entire world from scratch, you can eliminate the --no-substitutes option to have Guix download from available binary sources. Note that this convenience doesn't necessarily compromise your security, as you can check that a package was built correctly after the fact using guix build --check <packagename>

Therefore, we can perform a build of bitcoin much like in Gitian by invoking the following:

make -C depends -j"$(nproc)" download && \
    cat contrib/guix/build.sh | guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes

We don't include make -C depends -j"$(nproc)" download inside contrib/guix/build.sh because contrib/guix/build.sh is run inside the container, which has no network access (which is a good thing).

Rationale

I believe that this represents a substantial improvement for the "supply chain security" of bitcoin because:

  1. We no longer have to rely on Ubuntu for our build environment for our releases (oh the horror), because Guix builds everything about the container, we can perform this on almost any Linux distro/system.
  2. It is now much easier to determine what trusted binaries are in our supply chain, and even make a nice visualization! (see bootstrappability).
  3. There is active effort among Guix folks to minimize the number of trusted binaries even further. OriansJ's stage0, and janneke's Mes all aim to achieve reduced binary boostrap for Guix. In fact, I believe if OriansJ gets his way, we will end up some day with only a single trusted binary: hex0 (a ~500 byte self-hosting hex assembler).

Steps to Completion

  • Successfully build bitcoin inside the Guix environment
  • Make check-symbols pass
  • Do the above but without nasty hacks
  • Solve some of the more innocuous hacks
  • Make it cross-compile (HELP WANTED HERE)
    • Linux
      • x86_64-linux-gnu
      • i686-linux-gnu
      • aarch64-linux-gnu
      • arm-linux-gnueabihf
      • riscv64-linux-gnu
    • OS X
      • x86_64-apple-darwin14
    • Windows
      • x86_64-w64-mingw32
  • Maybe make importer for depends syntax
  • Document build process for future releases
  • Extra: Pin the revision of Guix that we build with with Guix inferiors

Help Wanted

Old content no. 3

Old content no. 2

Old content no. 1 As of now, the command described above to perform a build of bitcoin a lot like Gitian works, but fails at the `check-symbols` stage. This is because a few dynamic libraries are linked in that shouldn't be.

Here's what ldd src/bitcoind looks like when built in a Guix container:

	linux-vdso.so.1 (0x00007ffcc2d90000)
	libdl.so.2 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libdl.so.2 (0x00007fb7eda09000)
	librt.so.1 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/librt.so.1 (0x00007fb7ed9ff000)
	libstdc++.so.6 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libstdc++.so.6 (0x00007fb7ed87c000)
	libpthread.so.0 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libpthread.so.0 (0x00007fb7ed85b000)
	libm.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libm.so.6 (0x00007fb7ed6da000)
	libgcc_s.so.1 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libgcc_s.so.1 (0x00007fb7ed6bf000)
	libc.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libc.so.6 (0x00007fb7ed506000)
	/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fb7ee3a0000)

And here's what it looks in one of our releases:

	linux-vdso.so.1 (0x00007ffff52cd000)
	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f87726b4000)
	librt.so.1 => /usr/lib/librt.so.1 (0x00007f87726aa000)
	libm.so.6 => /usr/lib/libm.so.6 (0x00007f8772525000)
	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f877250b000)
	libc.so.6 => /usr/lib/libc.so.6 (0x00007f8772347000)
	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f8773392000)

I suspect it is because my script does not apply the gitian-input patches described in the release process but there is no description as to how these patches are applied. It might also be something else entirely.

Edit: It is something else. It appears that the gitian inputs are only used by gitian-win-signer.yml

How to Help

  1. Install Guix on your distro either from source or perform a binary installation
  2. Try out my branch and the command described above!

@ryanofsky
Copy link
Contributor

To help explain this PR: I didn't immediately realize this change is mainly using GUIX as a container environment, not using GUIX as a package manger.

The depends command first downloads binaries because networking is not available in the container:

make -C depends -j"$(nproc)" download

Then a normal build is basically done, but inside a container with GUIX autotools, gcc, perl, etc packages:

guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes < contrib/guix/build.sh

src/Makefile.am Outdated Show resolved Hide resolved
@DrahtBot
Copy link
Contributor

DrahtBot commented Jan 28, 2019

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

Conflicts

No conflicts as of last run.

@practicalswift
Copy link
Contributor

practicalswift commented Jan 29, 2019

Concept ACK

@dongcarl The scope of PR would include making builds reproducible, right? If so, what type of reproducibility would be required? What are the reproducibility requirements of Guix?

@fanquake
Copy link
Member

Concept ACK

@dongcarl
Copy link
Contributor Author

@practicalswift Yes it would, we would want bit-for-bit reproducibility so that we can sign hashes just like in gitian. My plan is to use Guix simply as a container environment builder right now, which has worked quite well.

I've already upstreamed patches that would make the bitcoin-core Guix package deterministic. I think the next step after having everything working in a container environment is to make custom Guix packages for our depends (we can't just use the Guix package they have because of differing configure/build flags between Guix packages and our depends tree).

@laanwj
Copy link
Member

laanwj commented Jan 30, 2019

This PR enables building bitcoin in Guix containers. Guix is a transactional package manager much like Nix, but unlike Nix, it has more of a focus on bootstrappability and reproducibility which are attractive for security-sensitive projects like bitcoin.

Nice. I've been playing around with NixOS a bit lately, didn't know about guix. Concept ACK. Thanks for working on this!

@theuni what do you think?

[ -e /usr/bin ] || mkdir -p /usr/bin

# Symlink file to a conventional path
[ -e /usr/bin ] || ln -s "$(command -v file)" /usr/bin/file
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
[ -e /usr/bin ] || ln -s "$(command -v file)" /usr/bin/file
[ -e /usr/bin/file ] || ln -s "$(command -v file)" /usr/bin/file

@laanwj
Copy link
Member

laanwj commented Jan 31, 2019

Travis fail:

Missing expected shebang "#!/usr/bin/env bash" or "#!/bin/sh" in contrib/guix/build.sh

Copy link
Contributor

@wtogami wtogami left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your ldd output ...

/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fb7ee3a0000)

Sounds to be caused by Guix's intentional hardcoding with -rpath.

https://www.gnu.org/software/guix/manual/en/html_node/Application-Setup.html

The wrapper’s purpose is to inspect the -L and -l switches passed to the linker, add corresponding -rpath arguments, and invoke the actual linker with this new set of arguments. By default, the linker wrapper refuses to link to libraries outside the store to ensure “purity”. This can be annoying when using the toolchain to link with local libraries. To allow references to libraries outside the store you need to define the environment variable GUIX_LD_WRAPPER_ALLOW_IMPURITIES.

pkg-config
linux
certs
curl)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

curl shouldn't be necessary in the container if depends is pre-populated. May require editing the depends system?

CONFIGFLAGS="--enable-glibc-back-compat --enable-reduce-exports --disable-bench --disable-gui-tests"
HOST_CFLAGS="-O2 -g"
HOST_CXXFLAGS="-O2 -g"
HOST_LDFLAGS=-static-libstdc++
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

	libstdc++.so.6 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libstdc++.so.6 (0x00007fb7ed87c000)

Your ldd output indicates that it isn't static linking libstdc++.

@dongcarl
Copy link
Contributor Author

Just an update. I've worked through most of the problems, right now at the end of the build, when make -C src --jobs=1 check-symbols is executed, we get the following:

==> out <==
make: Entering directory '/home/dongcarl/src/bitcoin/v0.17.1-guix/src'
Checking glibc back compat...
qt/bitcoin-qt: NEEDED library libexpat.so.1 is not allowed

==> err <==
make: *** [Makefile:11768: check-symbols] Error 1

What's curious about this is that in our releases, libexpat shows up when I do ldd bitcoin-qt:

        libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007f7e48c95000)

which is almost identical to how it shows up when I do ldd src/qt/bitcoin-qt on my builds:

        libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007fe212e8a000)

Maybe I'm understanding how linkers work incorrectly, but will continue digging.

@wtogami
Copy link
Contributor

wtogami commented Feb 14, 2019

==> out <==
make: Entering directory '/home/dongcarl/src/bitcoin/v0.17.1-guix/src'
Checking glibc back compat...
qt/bitcoin-qt: NEEDED library libexpat.so.1 is not allowed

==> err <==
make: *** [Makefile:11768: check-symbols] Error 1

What's curious about this is that in our releases, libexpat shows up when I do ldd bitcoin-qt:

        libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007f7e48c95000)

which is almost identical to how it shows up when I do ldd src/qt/bitcoin-qt on my builds:

        libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007fe212e8a000)

Maybe I'm understanding how linkers work incorrectly, but will continue digging.

           $ objdump -p /path/to/program | grep NEEDED

       Note, however, that this alternative shows only the direct dependencies of the executable, while ldd shows the entire dependency tree of the executable.

@dongcarl
Copy link
Contributor Author

@wtogami Good find!
Here it is for my Guix container build of bitcoin-qt:

  NEEDED               libpthread.so.0
  NEEDED               libdl.so.2
  NEEDED               libm.so.6
  NEEDED               libfontconfig.so.1
  NEEDED               libexpat.so.1
  NEEDED               libfreetype.so.6
  NEEDED               libX11-xcb.so.1
  NEEDED               libX11.so.6
  NEEDED               libxcb.so.1
  NEEDED               librt.so.1
  NEEDED               libgcc_s.so.1
  NEEDED               libc.so.6
  NEEDED               ld-linux-x86-64.so.2

Here it is for the release version of bitcoin-qt:

  NEEDED               libpthread.so.0
  NEEDED               libdl.so.2
  NEEDED               libm.so.6
  NEEDED               libfontconfig.so.1
  NEEDED               libfreetype.so.6
  NEEDED               libX11-xcb.so.1
  NEEDED               libX11.so.6
  NEEDED               libxcb.so.1
  NEEDED               librt.so.1
  NEEDED               libgcc_s.so.1
  NEEDED               libc.so.6
  NEEDED               ld-linux-x86-64.so.2

It would seem that libexpat.so.1 is a direct dependency of the Guix build version but not the release version.

contrib/guix/build.sh Outdated Show resolved Hide resolved
depends/funcs.mk Outdated Show resolved Hide resolved
@laanwj laanwj added this to the 0.19.0 milestone Feb 21, 2019
@laanwj
Copy link
Member

laanwj commented Feb 21, 2019

Adding, optimistically, the 0.19 milestone.

@dongcarl
Copy link
Contributor Author

Another observation I made today: the guix build output had

  NEEDED               libdl.so.2

for bitcoind, bitcoin-cli, bitcoin-tx, and test_bitcoin, while the release versions didn't. However, bitcoin-qt had that NEED in both the guix build and the release build.

"which"
"tcsh"
"libtool"
"python2"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, why would we need this?

@maflcko
Copy link
Member

maflcko commented Feb 28, 2019

How much RAM is needed to build this? It seems that when compiling tar (or something) and running its unit tests, it OOMs

Currently I run gitian builds on a 1CPU 4GB bionic and the below failed on a machine with 8GB

$ guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
....



146: bad next volume                                 ok
147: file start at the beginning of a posix volume   ok

Owner and Groups

148: --owner and --group                             ok
149: --owner-map and --group-map                     ok

Sparse files

150: sparse files                                    ok
151: extracting sparse file over a pipe              ok
152: storing sparse files > 8G                       ok
153: storing long sparse file names                  ok
Killed

When I run guix environment --container --pure --no-grafts --no-substitutes tar it does not get killed.

Full logs from above:

stdout is empty
stderr is:

stderr
guile: warning: failed to install locale
hint: Consider installing the `glibc-utf8-locales' or `glibc-locales' package and
defining `GUIX_LOCPATH', along these lines:

     guix package -i glibc-utf8-locales
     export GUIX_LOCPATH="$HOME/.guix-profile/lib/locale"

See the "Application Setup" section in the manual, for more info.


The following derivations will be built:
   /gnu/store/vhv41qv6jp628638kpi4sz4j3zn4qc6k-profile.drv
   /gnu/store/p6ip1v8qaxjqvpyb2fh5xcs4zvxp79b0-info-dir.drv
   /gnu/store/ry9v3ggm7w4f8yg8vdgag70mzzvhr7sb-xz-5.2.4.tar.gz.drv
   /gnu/store/xfvxiv4vz34kffr48y9r5q7v0ng9sl2w-certdata2pem-2013.drv
   /gnu/store/aiyyn6psglsh74irdpb4xjckwx2ab0f7-xtrans-1.3.5.tar.bz2.drv
   /gnu/store/p22bal0ia4zwjnip1ygspasw0ihqbllb-xtrans-1.3.5.drv
   /gnu/store/ir6k33mr9qilg55sb9p0ip8md2fsip31-xcb-proto-1.13.tar.bz2.drv
   /gnu/store/f98gcg2vl9jga7a97r2rqlz3mzbqhzpl-python-minimal-3.7.0.drv
   /gnu/store/jm5j862fm8ir4nwgabs1l5f79ngzki5r-libxslt-1.1.32.drv
   /gnu/store/xgzvalqpjzrhrwx91j2n2q3sy1n2frwi-xcb-proto-1.13.drv
   /gnu/store/z2rs4kjpk93sbx3wjayrkpy8r4s9vg45-python-minimal-wrapper-3.7.0.drv
   /gnu/store/8as0ncngkj4agfjgww14m7kmk0ixl77j-fontconfig-2.13.1.drv
   /gnu/store/ai77aiv2zadhx9q8c3q6bfikvhdds9hp-libxft-2.3.2.drv
   /gnu/store/kn049rjvb6in7mprrkinzhgk1rxvg3fn-libxrender-0.9.10.drv
   /gnu/store/m7wznzi150l1xmzd4q3spakjfd45bgvf-xorgproto-2018.4.tar.bz2.drv
   /gnu/store/vm171sqh8872sa5d3w09bbf4dgzbciqs-util-macros-1.19.2.tar.bz2.drv
   /gnu/store/3ch9p55s0k01n1adqywlyyyhij318h3b-libxext-1.3.3.drv
   /gnu/store/3fhgy83diq5gb1cd26pysy4v2a1xcrj6-util-macros-1.19.2.drv
   /gnu/store/7s8mbaw3qrwldilcjm2ixw3ziacsjbb0-xorgproto-2018.4.drv
   /gnu/store/ikvkgar6yscbrg0n1nhiri305xk9qq48-tk-8.6.8.drv
   /gnu/store/pybyi9shr94xk27xxhrh5bxf57i8kapc-libxcb-1.13.drv
   /gnu/store/vh5iib4gysm7gbamqd7fi03ngvlfc9kn-libx11-1.6.6.drv
   /gnu/store/vvm5b4m9z5h49pphmwi2b38rz8jqnykp-libxau-1.0.8.drv
   /gnu/store/xsk9mn6kjbpvl4ayxh0hwm65p0fcvlwx-libxdmcp-1.1.2.drv
   /gnu/store/v1zzsnhnjrjsxbkk191n003187pl2x7m-util-linux-2.32.1.tar.xz.drv
   /gnu/store/5s2zhcmxz4b544mh71m0np880njwms70-net-base-5.3.drv
   /gnu/store/l10arjy2qx9wdvb2ww5czc03yiiiq16j-util-linux-2.32.1.tar.xz.drv
   /gnu/store/b78vb0m6gqadlhq6x9128md2kmrwhz7f-ca-certificate-bundle.drv
   /gnu/store/szrgb5jydahaxi9hfwlg38p04xzjqfxz-shishi-1.0.2.drv
   /gnu/store/1liq09a42rg51i2jsyav248jn4kb92bh-tzdata2018d.tar.gz.drv
   /gnu/store/xn642asrl27q5zdcpfb8jm6x3r8k64bx-tzcode2018d.tar.gz.drv
   /gnu/store/ha6aplh18j0mwm962f9m3gy7l5bb5xv5-libxml2-2.9.8.drv
   /gnu/store/j96ymnrypiwj0wg8vq3z26ncaa65rp95-tzdata-2018d.drv
   /gnu/store/0r4vmf2gv1h1627lixj8qxgnc25d00dx-python-wrapper-3.7.0.drv
   /gnu/store/0zklfyrrdw65c2q2972imdji0dy5yar8-libtiff-4.0.9.drv
   /gnu/store/dam9vx59xa6vvyzv60d9iv7vkm4nrcrn-tcl-8.6.8.drv
   /gnu/store/5l79hasx8c91rmcn3lk9s2a468idzfz8-ghostscript-9.24.drv
   /gnu/store/d077q0lpmlc0j78mgkrv89jyadbl7288-groff-1.22.3.drv
   /gnu/store/h0wghrjf1x7aqr3f5f59wvm15zav9plv-nghttp2-1.32.0.drv
   /gnu/store/mcykd75g6p353zrhx0wprnxyn3g7r8qd-gss-1.0.3.drv
   /gnu/store/s9jq43dj4wysb90kl9qk3r0sdwacqczl-openldap-2.4.46.drv
   /gnu/store/mw8ykj23iikxpm3p1z3j5vbf7i1zm0cr-which-2.21.tar.gz.drv
   /gnu/store/1zbzjr3acwjkz5f9bxf5way8qffy5va0-fonts-dir.drv
   /gnu/store/caa8w4lrzx8i8h2sy7c9y4npykblpw6r-pcre-8.42.drv
   /gnu/store/24g01xjcl4kg15nbf8z9sfsyldf9qvgf-gcc-8.2.0.drv
   /gnu/store/1jxh89f4fm9x8iniy1hw7xark15794cf-gcc-toolchain-8.2.0.drv
   /gnu/store/1sf91y8n6l9264s2h50fg7fd2nip1v2y-tcsh-6.20.00.drv
   /gnu/store/1w2ssg0lr638ix7gjv09v91hnl8fpmr4-grep-3.1.drv
   /gnu/store/5ainc4iplmapdby5k25g6kg6dixij6pn-which-2.21.drv
   /gnu/store/7k6a4cw5ij8hzfb67xb35fya2dc7b17m-curl-7.62.0.drv
   /gnu/store/b9vd4y9ayjhfkpf5r9394h6qjz1v6422-util-linux-2.32.1.drv
   /gnu/store/h9m9pzcycbqik310fkfs947j8fcjiach-python-3.7.0.drv
   /gnu/store/jkv17qls0wc8wa1827r339j2c7srx0ps-nss-certs-3.39.drv
   /gnu/store/ls2gzc9dls3mfii18xx79cangf25v1gn-python2-2.7.15.drv
   /gnu/store/n916hx1hb2b19fypa34q6874kfs3h63z-xz-5.2.4.drv
   /gnu/store/njbrqkirhklq4c7vdj5fk6x1x1pgpi8m-tar-1.30.drv
   /gnu/store/x4pkx320q9mjawy5hhafbv841jlip0q1-manual-database.drv
guile: warning: failed to install locale
hint: Consider installing the `glibc-utf8-locales' or `glibc-locales' package and
defining `GUIX_LOCPATH', along these lines:

     guix package -i glibc-utf8-locales
     export GUIX_LOCPATH="$HOME/.guix-profile/lib/locale"

See the "Application Setup" section in the manual, for more info.


building /gnu/store/njbrqkirhklq4c7vdj5fk6x1x1pgpi8m-tar-1.30.drv...
starting phase `set-SOURCE-DATE-EPOCH'
phase `set-SOURCE-DATE-EPOCH' succeeded after 0.0 seconds
starting phase `set-paths'
environment variable `PATH' set to `/gnu/store/bl3pxxj6frg0dww8pj5dvh2d1akwvj47-tar-1.30/bin:/gnu/store/h0c398zan9ibhk4w0c944vp5pwgzkfpd-gzip-1.9/bin:/gnu/store/j74aabxwayjl9yfyrm6ni482gykxq48b-bzip2-1.0.6/bin:/gnu/store/9425b5dwpfc04bb4p58hsjypxghliyr3-xz-5.2.4/bin:/gnu/store/ypiyk8ngn79cz655jrl0hng37xv54yjr-file-5.33/bin:/gnu/store/4bzzz0lzjc9b7bfsnqbq2j22d4fvf433-diffutils-3.6/bin:/gnu/store/a4rxl40jr7gmq8bp3dryq4yq67cwkwiw-patch-2.7.6/bin:/gnu/store/fd621k6fmdnr1yiw0lbvw5spqaa169j3-findutils-4.6.0/bin:/gnu/store/l67sib1ld0fgyf0f4vrzyxnmn4yvimvb-gawk-4.2.1/bin:/gnu/store/lmfddplnplxd03bcqv3w9pynbnr1fp8k-sed-4.5/bin:/gnu/store/02k245xy33cvcnr8vm3lagm9zmb1s2wa-grep-3.1/bin:/gnu/store/5s2nib1lrd2101bbrivcl17kjx1mspw6-coreutils-8.30/bin:/gnu/store/7j3941iannrngdvgbclyxid12vds5w9i-make-4.2.1/bin:/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin:/gnu/store/9ysmg2739n1ms84lx6hifncgc5l2hiy9-ld-wrapper-0/bin:/gnu/store/02iklp4swqs0ipxhg5x9b2shmj6b30h1-binutils-2.31.1/bin:/gnu/store/n2p1zs14y89lwkg9da68y12pc10c6sw9-gcc-5.5.0/bin:/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/bin:/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/sbin'
environment variable `BASH_LOADABLES_PATH' unset
environment variable `C_INCLUDE_PATH' set to `/gnu/store/j74aabxwayjl9yfyrm6ni482gykxq48b-bzip2-1.0.6/include:/gnu/store/9425b5dwpfc04bb4p58hsjypxghliyr3-xz-5.2.4/include:/gnu/store/ypiyk8ngn79cz655jrl0hng37xv54yjr-file-5.33/include:/gnu/store/l67sib1ld0fgyf0f4vrzyxnmn4yvimvb-gawk-4.2.1/include:/gnu/store/7j3941iannrngdvgbclyxid12vds5w9i-make-4.2.1/include:/gnu/store/02iklp4swqs0ipxhg5x9b2shmj6b30h1-binutils-2.31.1/include:/gnu/store/n2p1zs14y89lwkg9da68y12pc10c6sw9-gcc-5.5.0/include:/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/include:/gnu/store/xha1mk4qji8fmg62nygfzdx0l94ikdhm-linux-libre-headers-4.14.67/include'
environment variable `CPLUS_INCLUDE_PATH' set to `/gnu/store/j74aabxwayjl9yfyrm6ni482gykxq48b-bzip2-1.0.6/include:/gnu/store/9425b5dwpfc04bb4p58hsjypxghliyr3-xz-5.2.4/include:/gnu/store/ypiyk8ngn79cz655jrl0hng37xv54yjr-file-5.33/include:/gnu/store/l67sib1ld0fgyf0f4vrzyxnmn4yvimvb-gawk-4.2.1/include:/gnu/store/7j3941iannrngdvgbclyxid12vds5w9i-make-4.2.1/include:/gnu/store/02iklp4swqs0ipxhg5x9b2shmj6b30h1-binutils-2.31.1/include:/gnu/store/n2p1zs14y89lwkg9da68y12pc10c6sw9-gcc-5.5.0/include:/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/include:/gnu/store/xha1mk4qji8fmg62nygfzdx0l94ikdhm-linux-libre-headers-4.14.67/include'
environment variable `LIBRARY_PATH' set to `/gnu/store/j74aabxwayjl9yfyrm6ni482gykxq48b-bzip2-1.0.6/lib:/gnu/store/9425b5dwpfc04bb4p58hsjypxghliyr3-xz-5.2.4/lib:/gnu/store/ypiyk8ngn79cz655jrl0hng37xv54yjr-file-5.33/lib:/gnu/store/l67sib1ld0fgyf0f4vrzyxnmn4yvimvb-gawk-4.2.1/lib:/gnu/store/02iklp4swqs0ipxhg5x9b2shmj6b30h1-binutils-2.31.1/lib:/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib:/gnu/store/a3p8zc23w5asxck5h4mswz4s8yl9s6pa-glibc-2.28-static/lib:/gnu/store/mn3ymm3f2r4xjqf8m9fgmadh6b8p6fvr-glibc-utf8-locales-2.28/lib'
environment variable `GUIX_LOCPATH' set to `/gnu/store/mn3ymm3f2r4xjqf8m9fgmadh6b8p6fvr-glibc-utf8-locales-2.28/lib/locale'
phase `set-paths' succeeded after 0.0 seconds
starting phase `install-locale'
using 'en_US.utf8' locale for category "LC_ALL"
phase `install-locale' succeeded after 0.0 seconds
starting phase `unpack'
tar-1.30/
tar-1.30/ABOUT-NLS
tar-1.30/AUTHORS
tar-1.30/COPYING
tar-1.30/ChangeLog
tar-1.30/ChangeLog.1
tar-1.30/INSTALL
tar-1.30/Make.rules
tar-1.30/Makefile.am
tar-1.30/Makefile.in
tar-1.30/NEWS
tar-1.30/README
tar-1.30/THANKS
tar-1.30/TODO
tar-1.30/acinclude.m4
tar-1.30/aclocal.m4
tar-1.30/build-aux/
tar-1.30/build-aux/ar-lib
tar-1.30/build-aux/compile
tar-1.30/build-aux/config.guess
tar-1.30/build-aux/config.rpath
tar-1.30/build-aux/config.sub
tar-1.30/build-aux/depcomp
tar-1.30/build-aux/gitlog-to-changelog
tar-1.30/build-aux/install-sh
tar-1.30/build-aux/mdate-sh
tar-1.30/build-aux/missing
tar-1.30/build-aux/texinfo.tex
tar-1.30/build-aux/ylwrap
tar-1.30/config.h.in
tar-1.30/configure
tar-1.30/configure.ac
tar-1.30/doc/
tar-1.30/doc/Makefile.am
tar-1.30/doc/Makefile.in
tar-1.30/doc/dumpdir.texi
tar-1.30/doc/fdl.texi
tar-1.30/doc/freemanuals.texi
tar-1.30/doc/gendocs_template
tar-1.30/doc/genfile.texi
tar-1.30/doc/header.texi
tar-1.30/doc/intern.texi
tar-1.30/doc/mastermenu.el
tar-1.30/doc/parse-datetime.texi
tar-1.30/doc/recipes.texi
tar-1.30/doc/rendition.texi
tar-1.30/doc/rmt.8
tar-1.30/doc/snapshot.texi
tar-1.30/doc/sparse.texi
tar-1.30/doc/stamp-vti
tar-1.30/doc/tar-snapshot-edit.texi
tar-1.30/doc/tar.1
tar-1.30/doc/tar.info
tar-1.30/doc/tar.info-1
tar-1.30/doc/tar.info-2
tar-1.30/doc/tar.texi
tar-1.30/doc/texify.sed
tar-1.30/doc/untabify.el
tar-1.30/doc/value.texi
tar-1.30/doc/version.texi
tar-1.30/gnu/
tar-1.30/gnu/Makefile.am
tar-1.30/gnu/Makefile.in
tar-1.30/gnu/_Noreturn.h
tar-1.30/gnu/acl-errno-valid.c
tar-1.30/gnu/acl-internal.c
tar-1.30/gnu/acl-internal.h
tar-1.30/gnu/acl.h
tar-1.30/gnu/acl_entries.c
tar-1.30/gnu/alignof.h
tar-1.30/gnu/alloca.c
tar-1.30/gnu/alloca.in.h
tar-1.30/gnu/allocator.c
tar-1.30/gnu/allocator.h
tar-1.30/gnu/anytostr.c
tar-1.30/gnu/areadlink-with-size.c
tar-1.30/gnu/areadlink.c
tar-1.30/gnu/areadlink.h
tar-1.30/gnu/areadlinkat-with-size.c
tar-1.30/gnu/areadlinkat.c
tar-1.30/gnu/arg-nonnull.h
tar-1.30/gnu/argmatch.c
tar-1.30/gnu/argmatch.h
tar-1.30/gnu/argp-ba.c
tar-1.30/gnu/argp-eexst.c
tar-1.30/gnu/argp-fmtstream.c
tar-1.30/gnu/argp-fmtstream.h
tar-1.30/gnu/argp-fs-xinl.c
tar-1.30/gnu/argp-help.c
tar-1.30/gnu/argp-namefrob.h
tar-1.30/gnu/argp-parse.c
tar-1.30/gnu/argp-pin.c
tar-1.30/gnu/argp-pv.c
tar-1.30/gnu/argp-pvh.c
tar-1.30/gnu/argp-version-etc.c
tar-1.30/gnu/argp-version-etc.h
tar-1.30/gnu/argp-xinl.c
tar-1.30/gnu/argp.h
tar-1.30/gnu/asnprintf.c
tar-1.30/gnu/asprintf.c
tar-1.30/gnu/assure.h
tar-1.30/gnu/at-func.c
tar-1.30/gnu/at-func2.c
tar-1.30/gnu/backup-find.c
tar-1.30/gnu/backup-internal.h
tar-1.30/gnu/backupfile.c
tar-1.30/gnu/backupfile.h
tar-1.30/gnu/basename-lgpl.c
tar-1.30/gnu/basename.c
tar-1.30/gnu/bitrotate.c
tar-1.30/gnu/bitrotate.h
tar-1.30/gnu/btowc.c
tar-1.30/gnu/c++defs.h
tar-1.30/gnu/c-ctype.c
tar-1.30/gnu/c-ctype.h
tar-1.30/gnu/c-strcase.h
tar-1.30/gnu/c-strcasecmp.c
tar-1.30/gnu/c-strcaseeq.h
tar-1.30/gnu/c-strncasecmp.c
tar-1.30/gnu/canonicalize-lgpl.c
tar-1.30/gnu/careadlinkat.c
tar-1.30/gnu/careadlinkat.h
tar-1.30/gnu/chdir-long.c
tar-1.30/gnu/chdir-long.h
tar-1.30/gnu/chmodat.c
tar-1.30/gnu/chown.c
tar-1.30/gnu/chownat.c
tar-1.30/gnu/cloexec.c
tar-1.30/gnu/cloexec.h
tar-1.30/gnu/close-stream.c
tar-1.30/gnu/close-stream.h
tar-1.30/gnu/close.c
tar-1.30/gnu/closedir.c
tar-1.30/gnu/closeout.c
tar-1.30/gnu/closeout.h
tar-1.30/gnu/config.charset
tar-1.30/gnu/dirent--.h
tar-1.30/gnu/dirent-private.h
tar-1.30/gnu/dirent-safer.h
tar-1.30/gnu/dirent.in.h
tar-1.30/gnu/dirfd.c
tar-1.30/gnu/dirname-lgpl.c
tar-1.30/gnu/dirname.c
tar-1.30/gnu/dirname.h
tar-1.30/gnu/dosname.h
tar-1.30/gnu/dup-safer-flag.c
tar-1.30/gnu/dup-safer.c
tar-1.30/gnu/dup.c
tar-1.30/gnu/dup2.c
tar-1.30/gnu/errno.in.h
tar-1.30/gnu/error.c
tar-1.30/gnu/error.h
tar-1.30/gnu/euidaccess.c
tar-1.30/gnu/exclude.c
tar-1.30/gnu/exclude.h
tar-1.30/gnu/exitfail.c
tar-1.30/gnu/exitfail.h
tar-1.30/gnu/faccessat.c
tar-1.30/gnu/fchdir.c
tar-1.30/gnu/fchmodat.c
tar-1.30/gnu/fchown-stub.c
tar-1.30/gnu/fchownat.c
tar-1.30/gnu/fcntl.c
tar-1.30/gnu/fcntl.in.h
tar-1.30/gnu/fd-hook.c
tar-1.30/gnu/fd-hook.h
tar-1.30/gnu/fd-safer-flag.c
tar-1.30/gnu/fd-safer.c
tar-1.30/gnu/fdopendir.c
tar-1.30/gnu/fdutimensat.c
tar-1.30/gnu/file-has-acl.c
tar-1.30/gnu/fileblocks.c
tar-1.30/gnu/filename.h
tar-1.30/gnu/filenamecat-lgpl.c
tar-1.30/gnu/filenamecat.h
tar-1.30/gnu/flexmember.h
tar-1.30/gnu/float+.h
tar-1.30/gnu/float.c
tar-1.30/gnu/float.in.h
tar-1.30/gnu/fnmatch.c
tar-1.30/gnu/fnmatch.in.h
tar-1.30/gnu/fnmatch_loop.c
tar-1.30/gnu/fpending.c
tar-1.30/gnu/fpending.h
tar-1.30/gnu/fprintftime.c
tar-1.30/gnu/fprintftime.h
tar-1.30/gnu/fseek.c
tar-1.30/gnu/fseeko.c
tar-1.30/gnu/fstat.c
tar-1.30/gnu/fstatat.c
tar-1.30/gnu/full-write.c
tar-1.30/gnu/full-write.h
tar-1.30/gnu/futimens.c
tar-1.30/gnu/get-permissions.c
tar-1.30/gnu/getcwd-lgpl.c
tar-1.30/gnu/getcwd.c
tar-1.30/gnu/getdelim.c
tar-1.30/gnu/getdtablesize.c
tar-1.30/gnu/getfilecon.c
tar-1.30/gnu/getgroups.c
tar-1.30/gnu/getline.c
tar-1.30/gnu/getopt-cdefs.in.h
tar-1.30/gnu/getopt-core.h
tar-1.30/gnu/getopt-ext.h
tar-1.30/gnu/getopt-pfx-core.h
tar-1.30/gnu/getopt-pfx-ext.h
tar-1.30/gnu/getopt.c
tar-1.30/gnu/getopt.in.h
tar-1.30/gnu/getopt1.c
tar-1.30/gnu/getopt_int.h
tar-1.30/gnu/getpagesize.c
tar-1.30/gnu/getprogname.c
tar-1.30/gnu/getprogname.h
tar-1.30/gnu/gettext.h
tar-1.30/gnu/gettime.c
tar-1.30/gnu/gettimeofday.c
tar-1.30/gnu/group-member.c
tar-1.30/gnu/hard-locale.c
tar-1.30/gnu/hard-locale.h
tar-1.30/gnu/hash.c
tar-1.30/gnu/hash.h
tar-1.30/gnu/human.c
tar-1.30/gnu/human.h
tar-1.30/gnu/imaxtostr.c
tar-1.30/gnu/intprops.h
tar-1.30/gnu/inttostr.c
tar-1.30/gnu/inttostr.h
tar-1.30/gnu/inttypes.in.h
tar-1.30/gnu/iswblank.c
tar-1.30/gnu/itold.c
tar-1.30/gnu/langinfo.in.h
tar-1.30/gnu/lchown.c
tar-1.30/gnu/limits.in.h
tar-1.30/gnu/link.c
tar-1.30/gnu/linkat.c
tar-1.30/gnu/localcharset.c
tar-1.30/gnu/localcharset.h
tar-1.30/gnu/locale.in.h
tar-1.30/gnu/localeconv.c
tar-1.30/gnu/localtime-buffer.c
tar-1.30/gnu/localtime-buffer.h
tar-1.30/gnu/lseek.c
tar-1.30/gnu/lstat.c
tar-1.30/gnu/malloc.c
tar-1.30/gnu/malloca.c
tar-1.30/gnu/malloca.h
tar-1.30/gnu/malloca.valgrind
tar-1.30/gnu/mbchar.c
tar-1.30/gnu/mbchar.h
tar-1.30/gnu/mbrtowc.c
tar-1.30/gnu/mbscasecmp.c
tar-1.30/gnu/mbsinit.c
tar-1.30/gnu/mbsrtowcs-impl.h
tar-1.30/gnu/mbsrtowcs-state.c
tar-1.30/gnu/mbsrtowcs.c
tar-1.30/gnu/mbtowc-impl.h
tar-1.30/gnu/mbtowc.c
tar-1.30/gnu/mbuiter.c
tar-1.30/gnu/mbuiter.h
tar-1.30/gnu/memchr.c
tar-1.30/gnu/memchr.valgrind
tar-1.30/gnu/mempcpy.c
tar-1.30/gnu/memrchr.c
tar-1.30/gnu/minmax.h
tar-1.30/gnu/mkdir.c
tar-1.30/gnu/mkdirat.c
tar-1.30/gnu/mkdtemp.c
tar-1.30/gnu/mkfifo.c
tar-1.30/gnu/mkfifoat.c
tar-1.30/gnu/mknod.c
tar-1.30/gnu/mknodat.c
tar-1.30/gnu/mktime-internal.h
tar-1.30/gnu/mktime.c
tar-1.30/gnu/modechange.c
tar-1.30/gnu/modechange.h
tar-1.30/gnu/msvc-inval.c
tar-1.30/gnu/msvc-inval.h
tar-1.30/gnu/msvc-nothrow.c
tar-1.30/gnu/msvc-nothrow.h
tar-1.30/gnu/nl_langinfo.c
tar-1.30/gnu/nstrftime.c
tar-1.30/gnu/obstack.c
tar-1.30/gnu/obstack.h
tar-1.30/gnu/offtostr.c
tar-1.30/gnu/open.c
tar-1.30/gnu/openat-die.c
tar-1.30/gnu/openat-priv.h
tar-1.30/gnu/openat-proc.c
tar-1.30/gnu/openat.c
tar-1.30/gnu/openat.h
tar-1.30/gnu/opendir-safer.c
tar-1.30/gnu/opendir.c
tar-1.30/gnu/parse-datetime.c
tar-1.30/gnu/parse-datetime.h
tar-1.30/gnu/parse-datetime.y
tar-1.30/gnu/pathmax.h
tar-1.30/gnu/pipe-safer.c
tar-1.30/gnu/printf-args.c
tar-1.30/gnu/printf-args.h
tar-1.30/gnu/printf-parse.c
tar-1.30/gnu/printf-parse.h
tar-1.30/gnu/priv-set.c
tar-1.30/gnu/priv-set.h
tar-1.30/gnu/progname.c
tar-1.30/gnu/progname.h
tar-1.30/gnu/quote.h
tar-1.30/gnu/quotearg.c
tar-1.30/gnu/quotearg.h
tar-1.30/gnu/raise.c
tar-1.30/gnu/rawmemchr.c
tar-1.30/gnu/rawmemchr.valgrind
tar-1.30/gnu/read.c
tar-1.30/gnu/readdir.c
tar-1.30/gnu/readlink.c
tar-1.30/gnu/readlinkat.c
tar-1.30/gnu/realloc.c
tar-1.30/gnu/ref-add.sin
tar-1.30/gnu/ref-del.sin
tar-1.30/gnu/regcomp.c
tar-1.30/gnu/regex.c
tar-1.30/gnu/regex.h
tar-1.30/gnu/regex_internal.c
tar-1.30/gnu/regex_internal.h
tar-1.30/gnu/regexec.c
tar-1.30/gnu/rename.c
tar-1.30/gnu/renameat.c
tar-1.30/gnu/renameat2.c
tar-1.30/gnu/renameat2.h
tar-1.30/gnu/rewinddir.c
tar-1.30/gnu/rmdir.c
tar-1.30/gnu/root-uid.h
tar-1.30/gnu/rpmatch.c
tar-1.30/gnu/safe-read.c
tar-1.30/gnu/safe-read.h
tar-1.30/gnu/safe-write.c
tar-1.30/gnu/safe-write.h
tar-1.30/gnu/same-inode.h
tar-1.30/gnu/save-cwd.c
tar-1.30/gnu/save-cwd.h
tar-1.30/gnu/savedir.c
tar-1.30/gnu/savedir.h
tar-1.30/gnu/se-context.c
tar-1.30/gnu/se-context.in.h
tar-1.30/gnu/se-selinux.c
tar-1.30/gnu/se-selinux.in.h
tar-1.30/gnu/selinux-at.c
tar-1.30/gnu/selinux-at.h
tar-1.30/gnu/set-permissions.c
tar-1.30/gnu/setenv.c
tar-1.30/gnu/signal.in.h
tar-1.30/gnu/size_max.h
tar-1.30/gnu/sleep.c
tar-1.30/gnu/snprintf.c
tar-1.30/gnu/stat-macros.h
tar-1.30/gnu/stat-time.c
tar-1.30/gnu/stat-time.h
tar-1.30/gnu/stat-w32.c
tar-1.30/gnu/stat-w32.h
tar-1.30/gnu/stat.c
tar-1.30/gnu/statat.c
tar-1.30/gnu/stdalign.in.h
tar-1.30/gnu/stdarg.in.h
tar-1.30/gnu/stdbool.in.h
tar-1.30/gnu/stddef.in.h
tar-1.30/gnu/stdint.in.h
tar-1.30/gnu/stdio-impl.h
tar-1.30/gnu/stdio.in.h
tar-1.30/gnu/stdlib.in.h
tar-1.30/gnu/stpcpy.c
tar-1.30/gnu/strcasecmp.c
tar-1.30/gnu/strchrnul.c
tar-1.30/gnu/strchrnul.valgrind
tar-1.30/gnu/strdup.c
tar-1.30/gnu/streq.h
tar-1.30/gnu/strerror-override.c
tar-1.30/gnu/strerror-override.h
tar-1.30/gnu/strerror.c
tar-1.30/gnu/strftime.h
tar-1.30/gnu/string.in.h
tar-1.30/gnu/strings.in.h
tar-1.30/gnu/stripslash.c
tar-1.30/gnu/strncasecmp.c
tar-1.30/gnu/strndup.c
tar-1.30/gnu/strnlen.c
tar-1.30/gnu/strnlen1.c
tar-1.30/gnu/strnlen1.h
tar-1.30/gnu/strtoimax.c
tar-1.30/gnu/strtol.c
tar-1.30/gnu/strtoll.c
tar-1.30/gnu/strtoul.c
tar-1.30/gnu/strtoull.c
tar-1.30/gnu/strtoumax.c
tar-1.30/gnu/symlink.c
tar-1.30/gnu/symlinkat.c
tar-1.30/gnu/sys_stat.in.h
tar-1.30/gnu/sys_time.in.h
tar-1.30/gnu/sys_types.in.h
tar-1.30/gnu/sysexits.in.h
tar-1.30/gnu/tempname.c
tar-1.30/gnu/tempname.h
tar-1.30/gnu/time-internal.h
tar-1.30/gnu/time.in.h
tar-1.30/gnu/time_r.c
tar-1.30/gnu/time_rz.c
tar-1.30/gnu/timegm.c
tar-1.30/gnu/timespec-sub.c
tar-1.30/gnu/timespec.c
tar-1.30/gnu/timespec.h
tar-1.30/gnu/tzset.c
tar-1.30/gnu/uinttostr.c
tar-1.30/gnu/umaxtostr.c
tar-1.30/gnu/unistd--.h
tar-1.30/gnu/unistd-safer.h
tar-1.30/gnu/unistd.c
tar-1.30/gnu/unistd.in.h
tar-1.30/gnu/unitypes.in.h
tar-1.30/gnu/uniwidth/
tar-1.30/gnu/uniwidth/cjk.h
tar-1.30/gnu/uniwidth/width.c
tar-1.30/gnu/uniwidth.in.h
tar-1.30/gnu/unlink.c
tar-1.30/gnu/unlinkat.c
tar-1.30/gnu/unlinkdir.c
tar-1.30/gnu/unlinkdir.h
tar-1.30/gnu/unlocked-io.h
tar-1.30/gnu/unsetenv.c
tar-1.30/gnu/unused-parameter.h
tar-1.30/gnu/utime.c
tar-1.30/gnu/utime.in.h
tar-1.30/gnu/utimens.c
tar-1.30/gnu/utimens.h
tar-1.30/gnu/utimensat.c
tar-1.30/gnu/vasnprintf.c
tar-1.30/gnu/vasnprintf.h
tar-1.30/gnu/vasprintf.c
tar-1.30/gnu/verify.h
tar-1.30/gnu/version-etc-fsf.c
tar-1.30/gnu/version-etc.c
tar-1.30/gnu/version-etc.h
tar-1.30/gnu/vsnprintf.c
tar-1.30/gnu/warn-on-use.h
tar-1.30/gnu/wchar.in.h
tar-1.30/gnu/wcrtomb.c
tar-1.30/gnu/wctype-h.c
tar-1.30/gnu/wctype.in.h
tar-1.30/gnu/wcwidth.c
tar-1.30/gnu/write.c
tar-1.30/gnu/xalloc-die.c
tar-1.30/gnu/xalloc-oversized.h
tar-1.30/gnu/xalloc.h
tar-1.30/gnu/xasprintf.c
tar-1.30/gnu/xgetcwd.c
tar-1.30/gnu/xgetcwd.h
tar-1.30/gnu/xmalloc.c
tar-1.30/gnu/xsize.c
tar-1.30/gnu/xsize.h
tar-1.30/gnu/xstrndup.c
tar-1.30/gnu/xstrndup.h
tar-1.30/gnu/xstrtol-error.c
tar-1.30/gnu/xstrtol.c
tar-1.30/gnu/xstrtol.h
tar-1.30/gnu/xstrtoul.c
tar-1.30/gnu/xstrtoumax.c
tar-1.30/gnu/xvasprintf.c
tar-1.30/gnu/xvasprintf.h
tar-1.30/lib/
tar-1.30/lib/Makefile.am
tar-1.30/lib/Makefile.in
tar-1.30/lib/attr-xattr.in.h
tar-1.30/lib/paxerror.c
tar-1.30/lib/paxexit-status.c
tar-1.30/lib/paxlib.h
tar-1.30/lib/paxnames.c
tar-1.30/lib/rmt.h
tar-1.30/lib/rtapelib.c
tar-1.30/lib/stdopen.c
tar-1.30/lib/stdopen.h
tar-1.30/lib/system-ioctl.h
tar-1.30/lib/system.h
tar-1.30/lib/wordsplit.c
tar-1.30/lib/wordsplit.h
tar-1.30/lib/xattr-at.c
tar-1.30/lib/xattr-at.h
tar-1.30/m4/
tar-1.30/m4/00gnulib.m4
tar-1.30/m4/absolute-header.m4
tar-1.30/m4/acl.m4
tar-1.30/m4/alloca.m4
tar-1.30/m4/argp.m4
tar-1.30/m4/asm-underscore.m4
tar-1.30/m4/backupfile.m4
tar-1.30/m4/bison.m4
tar-1.30/m4/btowc.m4
tar-1.30/m4/builtin-expect.m4
tar-1.30/m4/canonicalize.m4
tar-1.30/m4/chdir-long.m4
tar-1.30/m4/chown.m4
tar-1.30/m4/clock_time.m4
tar-1.30/m4/close-stream.m4
tar-1.30/m4/close.m4
tar-1.30/m4/closedir.m4
tar-1.30/m4/closeout.m4
tar-1.30/m4/codeset.m4
tar-1.30/m4/configmake.m4
tar-1.30/m4/d-ino.m4
tar-1.30/m4/dirent-safer.m4
tar-1.30/m4/dirent_h.m4
tar-1.30/m4/dirfd.m4
tar-1.30/m4/dirname.m4
tar-1.30/m4/double-slash-root.m4
tar-1.30/m4/dup.m4
tar-1.30/m4/dup2.m4
tar-1.30/m4/eealloc.m4
tar-1.30/m4/environ.m4
tar-1.30/m4/errno_h.m4
tar-1.30/m4/error.m4
tar-1.30/m4/euidaccess.m4
tar-1.30/m4/exponentd.m4
tar-1.30/m4/extensions.m4
tar-1.30/m4/extern-inline.m4
tar-1.30/m4/faccessat.m4
tar-1.30/m4/fchdir.m4
tar-1.30/m4/fchmodat.m4
tar-1.30/m4/fchownat.m4
tar-1.30/m4/fcntl-o.m4
tar-1.30/m4/fcntl.m4
tar-1.30/m4/fcntl_h.m4
tar-1.30/m4/fdopendir.m4
tar-1.30/m4/fileblocks.m4
tar-1.30/m4/filenamecat.m4
tar-1.30/m4/flexmember.m4
tar-1.30/m4/float_h.m4
tar-1.30/m4/fnmatch.m4
tar-1.30/m4/fpending.m4
tar-1.30/m4/fseek.m4
tar-1.30/m4/fseeko.m4
tar-1.30/m4/fstat.m4
tar-1.30/m4/fstatat.m4
tar-1.30/m4/futimens.m4
tar-1.30/m4/getcwd-abort-bug.m4
tar-1.30/m4/getcwd-path-max.m4
tar-1.30/m4/getcwd.m4
tar-1.30/m4/getdelim.m4
tar-1.30/m4/getdtablesize.m4
tar-1.30/m4/getgroups.m4
tar-1.30/m4/getline.m4
tar-1.30/m4/getopt.m4
tar-1.30/m4/getpagesize.m4
tar-1.30/m4/getprogname.m4
tar-1.30/m4/gettext.m4
tar-1.30/m4/gettime.m4
tar-1.30/m4/gettimeofday.m4
tar-1.30/m4/glibc21.m4
tar-1.30/m4/gnulib-common.m4
tar-1.30/m4/gnulib-comp.m4
tar-1.30/m4/group-member.m4
tar-1.30/m4/hard-locale.m4
tar-1.30/m4/host-cpu-c-abi.m4
tar-1.30/m4/human.m4
tar-1.30/m4/iconv.m4
tar-1.30/m4/include_next.m4
tar-1.30/m4/intlmacosx.m4
tar-1.30/m4/intmax_t.m4
tar-1.30/m4/inttostr.m4
tar-1.30/m4/inttypes-pri.m4
tar-1.30/m4/inttypes.m4
tar-1.30/m4/inttypes_h.m4
tar-1.30/m4/iswblank.m4
tar-1.30/m4/langinfo_h.m4
tar-1.30/m4/largefile.m4
tar-1.30/m4/lchown.m4
tar-1.30/m4/lib-ld.m4
tar-1.30/m4/lib-link.m4
tar-1.30/m4/lib-prefix.m4
tar-1.30/m4/libunistring-base.m4
tar-1.30/m4/limits-h.m4
tar-1.30/m4/link-follow.m4
tar-1.30/m4/link.m4
tar-1.30/m4/linkat.m4
tar-1.30/m4/localcharset.m4
tar-1.30/m4/locale-fr.m4
tar-1.30/m4/locale-ja.m4
tar-1.30/m4/locale-zh.m4
tar-1.30/m4/locale_h.m4
tar-1.30/m4/localeconv.m4
tar-1.30/m4/localtime-buffer.m4
tar-1.30/m4/longlong.m4
tar-1.30/m4/lseek.m4
tar-1.30/m4/lstat.m4
tar-1.30/m4/malloc.m4
tar-1.30/m4/malloca.m4
tar-1.30/m4/manywarnings.m4
tar-1.30/m4/mbchar.m4
tar-1.30/m4/mbiter.m4
tar-1.30/m4/mbrtowc.m4
tar-1.30/m4/mbsinit.m4
tar-1.30/m4/mbsrtowcs.m4
tar-1.30/m4/mbstate_t.m4
tar-1.30/m4/mbtowc.m4
tar-1.30/m4/memchr.m4
tar-1.30/m4/mempcpy.m4
tar-1.30/m4/memrchr.m4
tar-1.30/m4/minmax.m4
tar-1.30/m4/mkdir.m4
tar-1.30/m4/mkdirat.m4
tar-1.30/m4/mkdtemp.m4
tar-1.30/m4/mkfifo.m4
tar-1.30/m4/mkfifoat.m4
tar-1.30/m4/mknod.m4
tar-1.30/m4/mktime.m4
tar-1.30/m4/mmap-anon.m4
tar-1.30/m4/mode_t.m4
tar-1.30/m4/modechange.m4
tar-1.30/m4/msvc-inval.m4
tar-1.30/m4/msvc-nothrow.m4
tar-1.30/m4/multiarch.m4
tar-1.30/m4/nl_langinfo.m4
tar-1.30/m4/nls.m4
tar-1.30/m4/nocrash.m4
tar-1.30/m4/nstrftime.m4
tar-1.30/m4/obstack.m4
tar-1.30/m4/off_t.m4
tar-1.30/m4/open-cloexec.m4
tar-1.30/m4/open.m4
tar-1.30/m4/openat.m4
tar-1.30/m4/opendir.m4
tar-1.30/m4/parse-datetime.m4
tar-1.30/m4/pathmax.m4
tar-1.30/m4/paxutils.m4
tar-1.30/m4/po.m4
tar-1.30/m4/printf.m4
tar-1.30/m4/priv-set.m4
tar-1.30/m4/progtest.m4
tar-1.30/m4/quote.m4
tar-1.30/m4/quotearg.m4
tar-1.30/m4/raise.m4
tar-1.30/m4/rawmemchr.m4
tar-1.30/m4/read.m4
tar-1.30/m4/readdir.m4
tar-1.30/m4/readlink.m4
tar-1.30/m4/readlinkat.m4
tar-1.30/m4/realloc.m4
tar-1.30/m4/regex.m4
tar-1.30/m4/rename.m4
tar-1.30/m4/renameat.m4
tar-1.30/m4/rewinddir.m4
tar-1.30/m4/rmdir.m4
tar-1.30/m4/rmt.m4
tar-1.30/m4/rpmatch.m4
tar-1.30/m4/rtapelib.m4
tar-1.30/m4/safe-read.m4
tar-1.30/m4/safe-write.m4
tar-1.30/m4/save-cwd.m4
tar-1.30/m4/savedir.m4
tar-1.30/m4/selinux-context-h.m4
tar-1.30/m4/selinux-selinux-h.m4
tar-1.30/m4/setenv.m4
tar-1.30/m4/signal_h.m4
tar-1.30/m4/size_max.m4
tar-1.30/m4/sleep.m4
tar-1.30/m4/snprintf.m4
tar-1.30/m4/ssize_t.m4
tar-1.30/m4/stat-time.m4
tar-1.30/m4/stat.m4
tar-1.30/m4/stdalign.m4
tar-1.30/m4/stdarg.m4
tar-1.30/m4/stdbool.m4
tar-1.30/m4/stddef_h.m4
tar-1.30/m4/stdint.m4
tar-1.30/m4/stdint_h.m4
tar-1.30/m4/stdio_h.m4
tar-1.30/m4/stdlib_h.m4
tar-1.30/m4/stpcpy.m4
tar-1.30/m4/strcase.m4
tar-1.30/m4/strchrnul.m4
tar-1.30/m4/strdup.m4
tar-1.30/m4/strerror.m4
tar-1.30/m4/string_h.m4
tar-1.30/m4/strings_h.m4
tar-1.30/m4/strndup.m4
tar-1.30/m4/strnlen.m4
tar-1.30/m4/strtoimax.m4
tar-1.30/m4/strtol.m4
tar-1.30/m4/strtoll.m4
tar-1.30/m4/strtoul.m4
tar-1.30/m4/strtoull.m4
tar-1.30/m4/strtoumax.m4
tar-1.30/m4/symlink.m4
tar-1.30/m4/symlinkat.m4
tar-1.30/m4/sys_socket_h.m4
tar-1.30/m4/sys_stat_h.m4
tar-1.30/m4/sys_time_h.m4
tar-1.30/m4/sys_types_h.m4
tar-1.30/m4/sysexits.m4
tar-1.30/m4/system.m4
tar-1.30/m4/tempname.m4
tar-1.30/m4/time_h.m4
tar-1.30/m4/time_r.m4
tar-1.30/m4/time_rz.m4
tar-1.30/m4/timegm.m4
tar-1.30/m4/timespec.m4
tar-1.30/m4/tm_gmtoff.m4
tar-1.30/m4/tzset.m4
tar-1.30/m4/ulonglong.m4
tar-1.30/m4/unistd-safer.m4
tar-1.30/m4/unistd_h.m4
tar-1.30/m4/unlink.m4
tar-1.30/m4/unlinkat.m4
tar-1.30/m4/unlinkdir.m4
tar-1.30/m4/unlocked-io.m4
tar-1.30/m4/utime.m4
tar-1.30/m4/utime_h.m4
tar-1.30/m4/utimens.m4
tar-1.30/m4/utimensat.m4
tar-1.30/m4/utimes.m4
tar-1.30/m4/vasnprintf.m4
tar-1.30/m4/vasprintf.m4
tar-1.30/m4/version-etc.m4
tar-1.30/m4/vsnprintf.m4
tar-1.30/m4/warn-on-use.m4
tar-1.30/m4/warnings.m4
tar-1.30/m4/wchar_h.m4
tar-1.30/m4/wchar_t.m4
tar-1.30/m4/wcrtomb.m4
tar-1.30/m4/wctype_h.m4
tar-1.30/m4/wcwidth.m4
tar-1.30/m4/wint_t.m4
tar-1.30/m4/write.m4
tar-1.30/m4/xalloc.m4
tar-1.30/m4/xgetcwd.m4
tar-1.30/m4/xsize.m4
tar-1.30/m4/xstrndup.m4
tar-1.30/m4/xstrtol.m4
tar-1.30/m4/xvasprintf.m4
tar-1.30/po/
tar-1.30/po/LINGUAS
tar-1.30/po/Makefile.in.in
tar-1.30/po/Makevars
tar-1.30/po/POTFILES.in
tar-1.30/po/Rules-quot
tar-1.30/po/bg.gmo
tar-1.30/po/bg.po
tar-1.30/po/boldquot.sed
tar-1.30/po/ca.gmo
tar-1.30/po/ca.po
tar-1.30/po/cs.gmo
tar-1.30/po/cs.po
tar-1.30/po/da.gmo
tar-1.30/po/da.po
tar-1.30/po/de.gmo
tar-1.30/po/de.po
tar-1.30/po/el.gmo
tar-1.30/po/el.po
tar-1.30/po/en@boldquot.header
tar-1.30/po/en@quot.header
tar-1.30/po/eo.gmo
tar-1.30/po/eo.po
tar-1.30/po/es.gmo
tar-1.30/po/es.po
tar-1.30/po/et.gmo
tar-1.30/po/et.po
tar-1.30/po/eu.gmo
tar-1.30/po/eu.po
tar-1.30/po/fi.gmo
tar-1.30/po/fi.po
tar-1.30/po/fr.gmo
tar-1.30/po/fr.po
tar-1.30/po/ga.gmo
tar-1.30/po/ga.po
tar-1.30/po/gl.gmo
tar-1.30/po/gl.po
tar-1.30/po/hr.gmo
tar-1.30/po/hr.po
tar-1.30/po/hu.gmo
tar-1.30/po/hu.po
tar-1.30/po/id.gmo
tar-1.30/po/id.po
tar-1.30/po/insert-header.sin
tar-1.30/po/it.gmo
tar-1.30/po/it.po
tar-1.30/po/ja.gmo
tar-1.30/po/ja.po
tar-1.30/po/ko.gmo
tar-1.30/po/ko.po
tar-1.30/po/ky.gmo
tar-1.30/po/ky.po
tar-1.30/po/ms.gmo
tar-1.30/po/ms.po
tar-1.30/po/nb.gmo
tar-1.30/po/nb.po
tar-1.30/po/nl.gmo
tar-1.30/po/nl.po
tar-1.30/po/pl.gmo
tar-1.30/po/pl.po
tar-1.30/po/pt.gmo
tar-1.30/po/pt.po
tar-1.30/po/pt_BR.gmo
tar-1.30/po/pt_BR.po
tar-1.30/po/quot.sed
tar-1.30/po/remove-potcdate.sin
tar-1.30/po/ro.gmo
tar-1.30/po/ro.po
tar-1.30/po/ru.gmo
tar-1.30/po/ru.po
tar-1.30/po/sk.gmo
tar-1.30/po/sk.po
tar-1.30/po/sl.gmo
tar-1.30/po/sl.po
tar-1.30/po/sr.gmo
tar-1.30/po/sr.po
tar-1.30/po/stamp-po
tar-1.30/po/sv.gmo
tar-1.30/po/sv.po
tar-1.30/po/tar.pot
tar-1.30/po/tr.gmo
tar-1.30/po/tr.po
tar-1.30/po/uk.gmo
tar-1.30/po/uk.po
tar-1.30/po/vi.gmo
tar-1.30/po/vi.po
tar-1.30/po/zh_CN.gmo
tar-1.30/po/zh_CN.po
tar-1.30/po/zh_TW.gmo
tar-1.30/po/zh_TW.po
tar-1.30/rmt/
tar-1.30/rmt/Makefile.am
tar-1.30/rmt/Makefile.in
tar-1.30/rmt/rmt.c
tar-1.30/scripts/
tar-1.30/scripts/Makefile.am
tar-1.30/scripts/Makefile.in
tar-1.30/scripts/backup-specs
tar-1.30/scripts/backup.in
tar-1.30/scripts/backup.sh.in
tar-1.30/scripts/dump-remind.in
tar-1.30/scripts/restore.in
tar-1.30/src/
tar-1.30/src/Makefile.am
tar-1.30/src/Makefile.in
tar-1.30/src/arith.h
tar-1.30/src/buffer.c
tar-1.30/src/checkpoint.c
tar-1.30/src/common.h
tar-1.30/src/compare.c
tar-1.30/src/create.c
tar-1.30/src/delete.c
tar-1.30/src/exclist.c
tar-1.30/src/exit.c
tar-1.30/src/extract.c
tar-1.30/src/incremen.c
tar-1.30/src/list.c
tar-1.30/src/map.c
tar-1.30/src/misc.c
tar-1.30/src/names.c
tar-1.30/src/sparse.c
tar-1.30/src/suffix.c
tar-1.30/src/system.c
tar-1.30/src/tar.c
tar-1.30/src/tar.h
tar-1.30/src/transform.c
tar-1.30/src/unlink.c
tar-1.30/src/update.c
tar-1.30/src/utf8.c
tar-1.30/src/warning.c
tar-1.30/src/xattrs.c
tar-1.30/src/xattrs.h
tar-1.30/src/xheader.c
tar-1.30/tests/
tar-1.30/tests/Makefile.am
tar-1.30/tests/Makefile.in
tar-1.30/tests/T-cd.at
tar-1.30/tests/T-dir00.at
tar-1.30/tests/T-dir01.at
tar-1.30/tests/T-empty.at
tar-1.30/tests/T-mult.at
tar-1.30/tests/T-nest.at
tar-1.30/tests/T-nonl.at
tar-1.30/tests/T-null.at
tar-1.30/tests/T-null2.at
tar-1.30/tests/T-rec.at
tar-1.30/tests/T-recurse.at
tar-1.30/tests/T-zfile.at
tar-1.30/tests/acls01.at
tar-1.30/tests/acls02.at
tar-1.30/tests/acls03.at
tar-1.30/tests/add-file.at
tar-1.30/tests/append.at
tar-1.30/tests/append01.at
tar-1.30/tests/append02.at
tar-1.30/tests/append03.at
tar-1.30/tests/append04.at
tar-1.30/tests/append05.at
tar-1.30/tests/argcv.c
tar-1.30/tests/argcv.h
tar-1.30/tests/atlocal.in
tar-1.30/tests/backup01.at
tar-1.30/tests/capabs_raw01.at
tar-1.30/tests/checkseekhole.c
tar-1.30/tests/chtype.at
tar-1.30/tests/ckmtime.c
tar-1.30/tests/comperr.at
tar-1.30/tests/comprec.at
tar-1.30/tests/delete01.at
tar-1.30/tests/delete02.at
tar-1.30/tests/delete03.at
tar-1.30/tests/delete04.at
tar-1.30/tests/delete05.at
tar-1.30/tests/difflink.at
tar-1.30/tests/dirrem01.at
tar-1.30/tests/dirrem02.at
tar-1.30/tests/exclude.at
tar-1.30/tests/exclude01.at
tar-1.30/tests/exclude02.at
tar-1.30/tests/exclude03.at
tar-1.30/tests/exclude04.at
tar-1.30/tests/exclude05.at
tar-1.30/tests/exclude06.at
tar-1.30/tests/exclude07.at
tar-1.30/tests/exclude08.at
tar-1.30/tests/exclude09.at
tar-1.30/tests/exclude10.at
tar-1.30/tests/exclude11.at
tar-1.30/tests/exclude12.at
tar-1.30/tests/exclude13.at
tar-1.30/tests/exclude14.at
tar-1.30/tests/exclude15.at
tar-1.30/tests/exclude16.at
tar-1.30/tests/extrac01.at
tar-1.30/tests/extrac02.at
tar-1.30/tests/extrac03.at
tar-1.30/tests/extrac04.at
tar-1.30/tests/extrac05.at
tar-1.30/tests/extrac06.at
tar-1.30/tests/extrac07.at
tar-1.30/tests/extrac08.at
tar-1.30/tests/extrac09.at
tar-1.30/tests/extrac10.at
tar-1.30/tests/extrac11.at
tar-1.30/tests/extrac12.at
tar-1.30/tests/extrac13.at
tar-1.30/tests/extrac14.at
tar-1.30/tests/extrac15.at
tar-1.30/tests/extrac16.at
tar-1.30/tests/extrac17.at
tar-1.30/tests/extrac18.at
tar-1.30/tests/extrac19.at
tar-1.30/tests/extrac20.at
tar-1.30/tests/extrac21.at
tar-1.30/tests/filerem01.at
tar-1.30/tests/filerem02.at
tar-1.30/tests/genfile.c
tar-1.30/tests/grow.at
tar-1.30/tests/gzip.at
tar-1.30/tests/ignfail.at
tar-1.30/tests/incr01.at
tar-1.30/tests/incr02.at
tar-1.30/tests/incr03.at
tar-1.30/tests/incr04.at
tar-1.30/tests/incr05.at
tar-1.30/tests/incr06.at
tar-1.30/tests/incr07.at
tar-1.30/tests/incr08.at
tar-1.30/tests/incr09.at
tar-1.30/tests/incr10.at
tar-1.30/tests/incr11.at
tar-1.30/tests/incremental.at
tar-1.30/tests/indexfile.at
tar-1.30/tests/label01.at
tar-1.30/tests/label02.at
tar-1.30/tests/label03.at
tar-1.30/tests/label04.at
tar-1.30/tests/label05.at
tar-1.30/tests/link01.at
tar-1.30/tests/link02.at
tar-1.30/tests/link03.at
tar-1.30/tests/link04.at
tar-1.30/tests/listed01.at
tar-1.30/tests/listed02.at
tar-1.30/tests/listed03.at
tar-1.30/tests/listed04.at
tar-1.30/tests/listed05.at
tar-1.30/tests/long01.at
tar-1.30/tests/longv7.at
tar-1.30/tests/lustar01.at
tar-1.30/tests/lustar02.at
tar-1.30/tests/lustar03.at
tar-1.30/tests/map.at
tar-1.30/tests/multiv01.at
tar-1.30/tests/multiv02.at
tar-1.30/tests/multiv03.at
tar-1.30/tests/multiv04.at
tar-1.30/tests/multiv05.at
tar-1.30/tests/multiv06.at
tar-1.30/tests/multiv07.at
tar-1.30/tests/multiv08.at
tar-1.30/tests/multiv09.at
tar-1.30/tests/multiv10.at
tar-1.30/tests/numeric.at
tar-1.30/tests/old.at
tar-1.30/tests/onetop01.at
tar-1.30/tests/onetop02.at
tar-1.30/tests/onetop03.at
tar-1.30/tests/onetop04.at
tar-1.30/tests/onetop05.at
tar-1.30/tests/opcomp01.at
tar-1.30/tests/opcomp02.at
tar-1.30/tests/opcomp03.at
tar-1.30/tests/opcomp04.at
tar-1.30/tests/opcomp05.at
tar-1.30/tests/opcomp06.at
tar-1.30/tests/options.at
tar-1.30/tests/options02.at
tar-1.30/tests/options03.at
tar-1.30/tests/owner.at
tar-1.30/tests/package.m4
tar-1.30/tests/pipe.at
tar-1.30/tests/positional01.at
tar-1.30/tests/positional02.at
tar-1.30/tests/positional03.at
tar-1.30/tests/recurs02.at
tar-1.30/tests/recurse.at
tar-1.30/tests/remfiles01.at
tar-1.30/tests/remfiles02.at
tar-1.30/tests/remfiles03.at
tar-1.30/tests/remfiles04a.at
tar-1.30/tests/remfiles04b.at
tar-1.30/tests/remfiles04c.at
tar-1.30/tests/remfiles05a.at
tar-1.30/tests/remfiles05b.at
tar-1.30/tests/remfiles05c.at
tar-1.30/tests/remfiles06a.at
tar-1.30/tests/remfiles06b.at
tar-1.30/tests/remfiles06c.at
tar-1.30/tests/remfiles07a.at
tar-1.30/tests/remfiles07b.at
tar-1.30/tests/remfiles07c.at
tar-1.30/tests/remfiles08a.at
tar-1.30/tests/remfiles08b.at
tar-1.30/tests/remfiles08c.at
tar-1.30/tests/remfiles09a.at
tar-1.30/tests/remfiles09b.at
tar-1.30/tests/remfiles09c.at
tar-1.30/tests/remfiles10.at
tar-1.30/tests/rename01.at
tar-1.30/tests/rename02.at
tar-1.30/tests/rename03.at
tar-1.30/tests/rename04.at
tar-1.30/tests/rename05.at
tar-1.30/tests/same-order01.at
tar-1.30/tests/same-order02.at
tar-1.30/tests/selacl01.at
tar-1.30/tests/selnx01.at
tar-1.30/tests/shortfile.at
tar-1.30/tests/shortrec.at
tar-1.30/tests/shortupd.at
tar-1.30/tests/sigpipe.at
tar-1.30/tests/sparse01.at
tar-1.30/tests/sparse02.at
tar-1.30/tests/sparse03.at
tar-1.30/tests/sparse04.at
tar-1.30/tests/sparse05.at
tar-1.30/tests/sparse06.at
tar-1.30/tests/sparse07.at
tar-1.30/tests/sparsemv.at
tar-1.30/tests/sparsemvp.at
tar-1.30/tests/spmvp00.at
tar-1.30/tests/spmvp01.at
tar-1.30/tests/spmvp10.at
tar-1.30/tests/star/
tar-1.30/tests/star/README
tar-1.30/tests/star/gtarfail.at
tar-1.30/tests/star/gtarfail2.at
tar-1.30/tests/star/multi-fail.at
tar-1.30/tests/star/pax-big-10g.at
tar-1.30/tests/star/quicktest.sh
tar-1.30/tests/star/ustar-big-2g.at
tar-1.30/tests/star/ustar-big-8g.at
tar-1.30/tests/testsuite
tar-1.30/tests/testsuite.at
tar-1.30/tests/time01.at
tar-1.30/tests/time02.at
tar-1.30/tests/truncate.at
tar-1.30/tests/update.at
tar-1.30/tests/update01.at
tar-1.30/tests/update02.at
tar-1.30/tests/update03.at
tar-1.30/tests/verbose.at
tar-1.30/tests/verify.at
tar-1.30/tests/version.at
tar-1.30/tests/volsize.at
tar-1.30/tests/volume.at
tar-1.30/tests/xattr01.at
tar-1.30/tests/xattr02.at
tar-1.30/tests/xattr03.at
tar-1.30/tests/xattr04.at
tar-1.30/tests/xattr05.at
tar-1.30/tests/xattr06.at
tar-1.30/tests/xattr07.at
tar-1.30/tests/xform-h.at
tar-1.30/tests/xform01.at
tar-1.30/tests/xform02.at
tar-1.30/tests/xform03.at
phase `unpack' succeeded after 0.2 seconds
starting phase `bootstrap'
GNU build system bootstrapping not needed
phase `bootstrap' succeeded after 0.0 seconds
starting phase `patch-usr-bin-file'
phase `patch-usr-bin-file' succeeded after 0.1 seconds
starting phase `patch-source-shebangs'
patch-shebang: ./build-aux/ar-lib: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./build-aux/compile: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./build-aux/config.guess: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./build-aux/config.rpath: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./build-aux/config.sub: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./build-aux/depcomp: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./build-aux/install-sh: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./build-aux/mdate-sh: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./build-aux/missing: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./build-aux/ylwrap: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./configure: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./gnu/config.charset: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./scripts/backup.in: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./scripts/backup.sh.in: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./scripts/dump-remind.in: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./scripts/restore.in: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./tests/star/quicktest.sh: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
patch-shebang: ./tests/testsuite: changing `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
phase `patch-source-shebangs' succeeded after 0.1 seconds
starting phase `configure'
source directory: "/tmp/guix-build-tar-1.30.drv-0/tar-1.30" (relative from build: ".")
build directory: "/tmp/guix-build-tar-1.30.drv-0/tar-1.30"
configure flags: ("CONFIG_SHELL=/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/bash" "SHELL=/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/bash" "--prefix=/gnu/store/ipx79bfj2mrc8npj7s3qi3zri11jfhaw-tar-1.30" "--enable-fast-install" "--build=x86_64-unknown-linux-gnu")
configure: WARNING: unrecognized options: --enable-fast-install
checking for a BSD-compatible install... /gnu/store/5s2nib1lrd2101bbrivcl17kjx1mspw6-coreutils-8.30/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /gnu/store/5s2nib1lrd2101bbrivcl17kjx1mspw6-coreutils-8.30/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... no
checking whether make supports nested variables... yes
checking whether UID '998' is supported by ustar format... yes
checking whether GID '998' is supported by ustar format... yes
checking how to create a ustar tar archive... gnutar
checking whether make supports nested variables... (cached) yes
checking for style of include used by make... GNU
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether gcc understands -c and -o together... yes
checking dependency style of gcc... gcc3
checking for gcc option to accept ISO C99... none needed
checking for gcc option to accept ISO Standard C... (cached) none needed
checking for ranlib... ranlib
checking for bison... no
checking for byacc... no
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /gnu/store/02k245xy33cvcnr8vm3lagm9zmb1s2wa-grep-3.1/bin/grep
checking for egrep... /gnu/store/02k245xy33cvcnr8vm3lagm9zmb1s2wa-grep-3.1/bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking minix/config.h usability... no
checking minix/config.h presence... no
checking for minix/config.h... no
checking whether it is safe to define __EXTENSIONS__... yes
checking whether _XOPEN_SOURCE should be defined... no
checking for Minix Amsterdam compiler... no
checking for ar... ar
checking for _LARGEFILE_SOURCE value needed for large files... no
checking for special C compiler options needed for large files... no
checking for _FILE_OFFSET_BITS value needed for large files... no
checking for special C compiler options needed for large files... (cached) no
checking for _FILE_OFFSET_BITS value needed for large files... (cached) no
checking for inline... inline
checking for fcntl.h... yes
checking for linux/fd.h... yes
checking for memory.h... (cached) yes
checking for net/errno.h... no
checking for sgtty.h... yes
checking for string.h... (cached) yes
checking for sys/param.h... yes
checking for sys/device.h... no
checking for sys/gentape.h... no
checking for sys/inet.h... no
checking for sys/io/trioctl.h... no
checking for sys/mtio.h... yes
checking for sys/time.h... yes
checking for sys/tprintf.h... no
checking for sys/tape.h... no
checking for unistd.h... (cached) yes
checking for locale.h... yes
checking for sys/types.h... (cached) yes
checking for features.h... yes
checking for linewrap.h... no
checking for sys/socket.h... yes
checking for dirent.h... yes
checking for wctype.h... yes
checking for stdio_ext.h... yes
checking for sys/stat.h... (cached) yes
checking for getopt.h... yes
checking for sys/cdefs.h... yes
checking for limits.h... yes
checking for wchar.h... yes
checking for stdint.h... (cached) yes
checking for inttypes.h... (cached) yes
checking for crtdefs.h... no
checking for langinfo.h... yes
checking for xlocale.h... no
checking for sys/mman.h... yes
checking for priv.h... no
checking for malloc.h... yes
checking for selinux/selinux.h... no
checking for strings.h... (cached) yes
checking for sysexits.h... yes
checking for utime.h... yes
checking for netdb.h... yes
checking for sys/wait.h... yes
checking for pwd.h... yes
checking for grp.h... yes
checking for sys/buf.h... no
checking sys/mkdev.h usability... no
checking sys/mkdev.h presence... no
checking for sys/mkdev.h... no
checking sys/sysmacros.h usability... yes
checking sys/sysmacros.h presence... yes
checking for sys/sysmacros.h... yes
checking for st_fstype string in struct stat... no
checking sys/acl.h usability... no
checking sys/acl.h presence... no
checking for sys/acl.h... no
checking for mode_t... yes
checking for pid_t... yes
checking for off_t... yes
checking for uid_t in sys/types.h... yes
checking for major_t... no
checking for minor_t... no
checking for dev_t... yes
checking for ino_t... yes
checking for ssize_t... yes
checking for fchmod... yes
checking for flockfile... yes
checking for funlockfile... yes
checking for pathconf... yes
checking for btowc... yes
checking for canonicalize_file_name... yes
checking for getcwd... yes
checking for readlink... yes
checking for realpath... yes
checking for readlinkat... yes
checking for chown... yes
checking for fchown... yes
checking for _set_invalid_parameter_handler... no
checking for fchdir... yes
checking for fdopendir... yes
checking for faccessat... yes
checking for fchmodat... yes
checking for lchmod... no
checking for fcntl... yes
checking for symlink... yes
checking for mempcpy... yes
checking for isblank... yes
checking for iswctype... yes
checking for mbsrtowcs... yes
checking for wmemchr... yes
checking for wmemcpy... yes
checking for wmempcpy... yes
checking for fstatat... yes
checking for futimens... yes
checking for getdelim... yes
checking for getdtablesize... yes
checking for getprogname... no
checking for getexecname... no
checking for gettimeofday... yes
checking for nanotime... no
checking for iswcntrl... yes
checking for iswblank... yes
checking for link... yes
checking for openat... yes
checking for linkat... yes
checking for lstat... yes
checking for mbsinit... yes
checking for mbrtowc... yes
checking for mprotect... yes
checking for mkdirat... yes
checking for mkfifo... yes
checking for mkfifoat... yes
checking for mknodat... yes
checking for mknod... yes
checking for tzset... yes
checking for nl_langinfo... yes
checking for renameat... yes
checking for setenv... yes
checking for sleep... yes
checking for snprintf... yes
checking for strdup... yes
checking for strndup... yes
checking for strtoimax... yes
checking for strtoumax... yes
checking for symlinkat... yes
checking for localtime_r... yes
checking for timegm... yes
checking for pipe... yes
checking for unlinkat... yes
checking for utime... yes
checking for futimes... yes
checking for futimesat... yes
checking for utimensat... yes
checking for lutimes... yes
checking for vasnprintf... no
checking for wcrtomb... yes
checking for wcwidth... yes
checking for setlocale... yes
checking for fsync... yes
checking for size_t... yes
checking for working alloca.h... yes
checking for alloca... yes
checking for C/C++ restrict keyword... __restrict
checking whether clearerr_unlocked is declared... yes
checking whether feof_unlocked is declared... yes
checking whether ferror_unlocked is declared... yes
checking whether fflush_unlocked is declared... yes
checking whether fgets_unlocked is declared... yes
checking whether fputc_unlocked is declared... yes
checking whether fputs_unlocked is declared... yes
checking whether fread_unlocked is declared... yes
checking whether fwrite_unlocked is declared... yes
checking whether getc_unlocked is declared... yes
checking whether getchar_unlocked is declared... yes
checking whether putc_unlocked is declared... yes
checking whether putchar_unlocked is declared... yes
checking whether strerror_r is declared... yes
checking for strerror_r... yes
checking whether strerror_r returns char *... yes
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking for d_ino member in directory struct... yes
checking for long file names... yes
checking whether <wchar.h> uses 'inline' correctly... yes
checking for nl_langinfo and CODESET... yes
checking for a traditional french locale... none
checking whether // is distinct from /... no
checking whether realpath works... yes
checking for unistd.h... (cached) yes
checking for working chown... yes
checking whether chown dereferences symlinks... yes
checking whether chown honors trailing slash... yes
checking whether chown always updates ctime... yes
checking whether the preprocessor supports include_next... yes
checking whether system header files limit the line length... no
checking if environ is properly declared... yes
checking for complete errno.h... yes
checking type of array argument to getgroups... gid_t
checking whether lstat correctly handles trailing slash... yes
checking whether fchdir is declared... yes
checking for working fcntl.h... yes
checking for mbstate_t... yes
checking whether stdin defaults to large file offsets... yes
checking whether fseeko is declared... yes
checking for fseeko... yes
checking whether stat file-mode macros are broken... no
checking for nlink_t... yes
checking whether fchmodat is declared without a macro... yes
checking whether fstat is declared without a macro... yes
checking whether fstatat is declared without a macro... yes
checking whether futimens is declared without a macro... yes
checking whether lchmod is declared without a macro... yes
checking whether lstat is declared without a macro... yes
checking whether mkdirat is declared without a macro... yes
checking whether mkfifo is declared without a macro... yes
checking whether mkfifoat is declared without a macro... yes
checking whether mknod is declared without a macro... yes
checking whether mknodat is declared without a macro... yes
checking whether stat is declared without a macro... yes
checking whether utimensat is declared without a macro... yes
checking whether getcwd (NULL, 0) allocates memory for result... yes
checking for getcwd with POSIX signature... yes
checking whether getcwd is declared... yes
checking whether getdelim is declared... yes
checking whether getdtablesize is declared... yes
checking whether getline is declared... yes
checking for getopt.h... (cached) yes
checking for getopt_long_only... yes
checking whether getopt is POSIX compatible... yes
checking for working GNU getopt function... yes
checking for working GNU getopt_long function... yes
checking for struct timeval... yes
checking for wide-enough struct timeval.tv_sec member... yes
checking whether gettimeofday is declared without a macro... yes
checking host CPU and C ABI... x86_64
checking whether limits.h has ULLONG_WIDTH etc.... yes
checking for wint_t... yes
checking whether wint_t is too small... no
checking for unsigned long long int... yes
checking for long long int... yes
checking whether stdint.h conforms to C99... yes
checking whether stdint.h predates C++11... no
checking whether stdint.h has UINTMAX_WIDTH etc.... yes
checking whether imaxabs is declared without a macro... yes
checking whether imaxdiv is declared without a macro... yes
checking whether strtoimax is declared without a macro... yes
checking whether strtoumax is declared without a macro... yes
checking for inttypes.h... (cached) yes
checking whether the inttypes.h PRIxNN macros are broken... no
checking whether iswcntrl works... yes
checking for towlower... yes
checking for wctype_t... yes
checking for wctrans_t... yes
checking whether wctype is declared without a macro... yes
checking whether iswctype is declared without a macro... yes
checking whether wctrans is declared without a macro... yes
checking whether towctrans is declared without a macro... yes
checking for O_CLOEXEC... yes
checking whether we are using the GNU C Library >= 2.1 or uClibc... yes
checking for wchar_t... yes
checking for max_align_t... yes
checking whether NULL can be used in arbitrary expressions... yes
checking whether malloc, realloc, calloc are POSIX compliant... yes
checking for stdlib.h... (cached) yes
checking for GNU libc compatible malloc... yes
checking for a traditional japanese locale... none
checking for a transitional chinese locale... none
checking for a french Unicode locale... fr_FR.UTF-8
checking for mmap... yes
checking for MAP_ANONYMOUS... yes
checking whether memchr works... yes
checking whether memrchr is declared... yes
checking whether <limits.h> defines MIN and MAX... no
checking whether <sys/param.h> defines MIN and MAX... yes
checking whether time_t is signed... yes
checking whether alarm is declared... yes
checking for working mktime... yes
checking whether struct tm is in sys/time.h or time.h... time.h
checking for struct tm.tm_zone... yes
checking for struct tm.tm_gmtoff... yes
checking for promoted mode_t type... mode_t
checking for stdbool.h that conforms to C99... yes
checking for _Bool... yes
checking for compound literals... yes
checking for library containing setfilecon... no
checking whether setenv is declared... yes
checking search.h usability... yes
checking search.h presence... yes
checking for search.h... yes
checking for tsearch... yes
checking for sigset_t... yes
checking whether snprintf returns a byte count as in C99... yes
checking whether snprintf is declared... yes
checking whether strdup is declared... yes
checking whether strerror(0) succeeds... yes
checking whether ffsl is declared without a macro... yes
checking whether ffsll is declared without a macro... yes
checking whether memmem is declared without a macro... yes
checking whether mempcpy is declared without a macro... yes
checking whether memrchr is declared without a macro... yes
checking whether rawmemchr is declared without a macro... yes
checking whether stpcpy is declared without a macro... yes
checking whether stpncpy is declared without a macro... yes
checking whether strchrnul is declared without a macro... yes
checking whether strdup is declared without a macro... yes
checking whether strncat is declared without a macro... yes
checking whether strndup is declared without a macro... yes
checking whether strnlen is declared without a macro... yes
checking whether strpbrk is declared without a macro... yes
checking whether strsep is declared without a macro... yes
checking whether strcasestr is declared without a macro... yes
checking whether strtok_r is declared without a macro... yes
checking whether strerror_r is declared without a macro... yes
checking whether strsignal is declared without a macro... yes
checking whether strverscmp is declared without a macro... yes
checking whether ffs is declared without a macro... yes
checking whether strcasecmp is declared without a macro... yes
checking whether strncasecmp is declared without a macro... yes
checking whether strndup is declared... (cached) yes
checking whether strnlen is declared... (cached) yes
checking whether strtoimax is declared... (cached) yes
checking whether strtoumax is declared... (cached) yes
checking for struct timespec in <time.h>... yes
checking whether unsetenv is declared... yes
checking whether the utimes function works... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for intmax_t... yes
checking where to find the exponent in a 'double'... word 1 bit 20
checking for snprintf... (cached) yes
checking for strnlen... yes
checking for wcslen... yes
checking for wcsnlen... yes
checking for mbrtowc... (cached) yes
checking for wcrtomb... (cached) yes
checking whether _snprintf is declared... no
checking whether vsnprintf is declared... yes
checking for sys/acl.h... (cached) no
configure: WARNING: libacl development library was not found or not usable.
configure: WARNING: GNU tar will be built without ACL support.
checking for alloca as a compiler built-in... yes
checking whether program_invocation_name is declared... yes
checking whether program_invocation_short_name is declared... yes
checking whether program_invocation_name is defined... yes
checking whether program_invocation_short_name is defined... yes
checking whether btowc(0) is correct... yes
checking whether btowc(EOF) is correct... guessing yes
checking for __builtin_expect... yes
checking whether this system has an arbitrary file name length limit... yes
checking for library containing clock_gettime... none required
checking for clock_gettime... yes
checking for clock_settime... yes
checking for closedir... yes
checking for d_ino member in directory struct... (cached) yes
checking whether alphasort is declared without a macro... yes
checking whether closedir is declared without a macro... yes
checking whether dirfd is declared without a macro... yes
checking whether fdopendir is declared without a macro... yes
checking whether opendir is declared without a macro... yes
checking whether readdir is declared without a macro... yes
checking whether rewinddir is declared without a macro... yes
checking whether scandir is declared without a macro... yes
checking for dirfd... yes
checking whether dirfd is declared... (cached) yes
checking whether dirfd is a macro... no
checking whether // is distinct from /... (cached) no
checking whether dup works... yes
checking whether dup2 works... yes
checking for error_at_line... yes
checking for euidaccess... yes
checking for fchownat... yes
checking whether fchownat works with AT_SYMLINK_NOFOLLOW... yes
checking whether fchownat works with an empty file name... yes
checking whether fcntl handles F_DUPFD correctly... yes
checking whether fcntl understands F_DUPFD_CLOEXEC... needs runtime check
checking whether fcntl is declared without a macro... yes
checking whether openat is declared without a macro... yes
checking whether fdopendir is declared... (cached) yes
checking whether fdopendir works... yes
checking for getxattr with XATTR_NAME_POSIX_ACL macros... yes
checking for struct stat.st_blocks... yes
checking for flexible array member... yes
checking whether conversion from 'int' to 'long double' works... yes
checking for working GNU fnmatch... yes
checking for __fpending... yes
checking whether __fpending is declared... yes
checking for fseeko... (cached) yes
checking whether fstatat (..., 0) works... yes
checking whether futimens works... yes
checking whether getcwd handles long file names properly... yes
checking for getpagesize... yes
checking whether getcwd aborts when 4k < cwd_length < 16k... no
checking for working getdelim function... yes
checking whether getdtablesize works... yes
checking for getgroups... yes
checking for working getgroups... yes
checking whether getgroups handles negative values... yes
checking for getline... yes
checking for working getline function... yes
checking for getpagesize... (cached) yes
checking whether getpagesize is declared... yes
checking whether program_invocation_name is declared... (cached) yes
checking whether program_invocation_short_name is declared... (cached) yes
checking whether __argv is declared... no
checking whether gettimeofday clobbers localtime buffer... no
checking for gettimeofday with POSIX signature... almost
checking for group_member... yes
checking whether INT32_MAX < INTMAX_MAX... yes
checking whether INT64_MAX == LONG_MAX... yes
checking whether UINT32_MAX < UINTMAX_MAX... yes
checking whether UINT64_MAX == ULONG_MAX... yes
checking whether iswblank is declared... yes
checking whether langinfo.h defines CODESET... yes
checking whether langinfo.h defines T_FMT_AMPM... yes
checking whether langinfo.h defines ERA... yes
checking whether langinfo.h defines YESEXPR... yes
checking whether nl_langinfo is declared without a macro... yes
checking for lchown... yes
checking whether link obeys POSIX... yes
checking for __xpg4... no
checking whether link(2) dereferences a symlink... no
checking whether linkat() can link symlinks... yes
checking whether linkat handles trailing slash correctly... yes
checking whether locale.h conforms to POSIX:2001... yes
checking whether struct lconv is properly defined... yes
checking whether setlocale is declared without a macro... yes
checking whether duplocale is declared without a macro... yes
checking whether lseek detects pipes... yes
checking for stdlib.h... (cached) yes
checking for GNU libc compatible malloc... (cached) yes
checking whether mbrtowc handles incomplete characters... guessing yes
checking whether mbrtowc works as well as mbtowc... guessing yes
checking whether mbrtowc handles a NULL pwc argument... yes
checking whether mbrtowc handles a NULL string argument... yes
checking whether mbrtowc has a correct return value... yes
checking whether mbrtowc returns 0 when parsing a NUL character... guessing yes
checking whether mbrtowc works on empty input... yes
checking whether the C locale is free of encoding errors... no
checking whether mbrtowc handles incomplete characters... (cached) guessing yes
checking whether mbrtowc works as well as mbtowc... (cached) guessing yes
checking whether mbrtowc handles incomplete characters... (cached) guessing yes
checking whether mbrtowc works as well as mbtowc... (cached) guessing yes
checking whether mbsrtowcs works... yes
checking for mempcpy... (cached) yes
checking for memrchr... yes
checking whether mkdir handles trailing slash... yes
checking whether mkdir handles trailing dot... yes
checking for mkdtemp... yes
checking whether mkfifo rejects trailing slashes... yes
checking whether mknod can create fifo without root privileges... yes
checking for __mktime_internal... no
checking whether YESEXPR works... yes
checking for obstacks that work with any size object... no
checking whether open recognizes a trailing slash... yes
checking for opendir... yes
checking for struct tm.tm_zone... (cached) yes
checking for getppriv... no
checking whether program_invocation_name is declared... (cached) yes
checking whether program_invocation_short_name is declared... (cached) yes
checking for raise... yes
checking for rawmemchr... yes
checking for readdir... yes
checking whether readlink signature is correct... yes
checking whether readlink handles trailing slash correctly... yes
checking whether readlinkat signature is correct... yes
checking for working re_compile_pattern... yes
checking whether rename honors trailing slash on destination... yes
checking whether rename honors trailing slash on source... yes
checking whether rename manages hard links correctly... yes
checking whether rename manages existing destinations correctly... yes
checking linux/fs.h usability... yes
checking linux/fs.h presence... yes
checking for linux/fs.h... yes
checking for linux/fs.h... (cached) yes
checking for rewinddir... yes
checking whether rmdir works... yes
checking for rpmatch... yes
checking selinux/flask.h usability... no
checking selinux/flask.h presence... no
checking for selinux/flask.h... no
checking whether setenv validates arguments... yes
checking for volatile sig_atomic_t... yes
checking for sighandler_t... yes
checking whether pthread_sigmask is declared without a macro... yes
checking whether sigaction is declared without a macro... yes
checking whether sigaddset is declared without a macro... yes
checking whether sigdelset is declared without a macro... yes
checking whether sigemptyset is declared without a macro... yes
checking whether sigfillset is declared without a macro... yes
checking whether sigismember is declared without a macro... yes
checking whether sigpending is declared without a macro... yes
checking whether sigprocmask is declared without a macro... yes
checking for stdint.h... (cached) yes
checking for SIZE_MAX... yes
checking whether sleep is declared... yes
checking for working sleep... yes
checking for snprintf... (cached) yes
checking whether snprintf respects a size of 1... yes
checking whether printf supports POSIX/XSI format strings with positions... yes
checking for ssize_t... (cached) yes
checking whether stat handles trailing slashes on files... yes
checking for struct stat.st_atim.tv_nsec... yes
checking whether struct stat.st_atim is of type struct timespec... yes
checking for struct stat.st_birthtimespec.tv_nsec... no
checking for struct stat.st_birthtimensec... no
checking for struct stat.st_birthtim.tv_nsec... no
checking for working stdalign.h... yes
checking for va_copy... yes
checking for max_align_t... (cached) yes
checking whether NULL can be used in arbitrary expressions... (cached) yes
checking which flavor of printf attribute matches inttypes macros... system
checking whether dprintf is declared without a macro... yes
checking whether fpurge is declared without a macro... no
checking whether fseeko is declared without a macro... yes
checking whether ftello is declared without a macro... yes
checking whether getdelim is declared without a macro... yes
checking whether getline is declared without a macro... yes
checking whether gets is declared without a macro... no
checking whether pclose is declared without a macro... yes
checking whether popen is declared without a macro... yes
checking whether renameat is declared without a macro... yes
checking whether snprintf is declared without a macro... yes
checking whether tmpfile is declared without a macro... yes
checking whether vdprintf is declared without a macro... yes
checking whether vsnprintf is declared without a macro... yes
checking whether _Exit is declared without a macro... yes
checking whether atoll is declared without a macro... yes
checking whether canonicalize_file_name is declared without a macro... yes
checking whether getloadavg is declared without a macro... yes
checking whether getsubopt is declared without a macro... yes
checking whether grantpt is declared without a macro... yes
checking whether initstate is declared without a macro... yes
checking whether initstate_r is declared without a macro... yes
checking whether mkdtemp is declared without a macro... yes
checking whether mkostemp is declared without a macro... yes
checking whether mkostemps is declared without a macro... yes
checking whether mkstemp is declared without a macro... yes
checking whether mkstemps is declared without a macro... yes
checking whether posix_openpt is declared without a macro... yes
checking whether ptsname is declared without a macro... yes
checking whether ptsname_r is declared without a macro... yes
checking whether qsort_r is declared without a macro... yes
checking whether random is declared without a macro... yes
checking whether random_r is declared without a macro... yes
checking whether reallocarray is declared without a macro... yes
checking whether realpath is declared without a macro... yes
checking whether rpmatch is declared without a macro... yes
checking whether secure_getenv is declared without a macro... yes
checking whether setenv is declared without a macro... yes
checking whether setstate is declared without a macro... yes
checking whether setstate_r is declared without a macro... yes
checking whether srandom is declared without a macro... yes
checking whether srandom_r is declared without a macro... yes
checking whether strtod is declared without a macro... yes
checking whether strtoll is declared without a macro... yes
checking whether strtoull is declared without a macro... yes
checking whether unlockpt is declared without a macro... yes
checking whether unsetenv is declared without a macro... yes
checking for stpcpy... yes
checking for strcasecmp... yes
checking for strncasecmp... yes
checking whether strncasecmp is declared... (cached) yes
checking for strchrnul... yes
checking whether strchrnul works... yes
checking for working strerror function... yes
checking for working strndup... yes
checking for working strnlen... yes
checking whether strtoimax works... yes
checking for strtol... yes
checking for strtoll... yes
checking for strtoul... yes
checking for strtoull... yes
checking whether symlink handles trailing slash correctly... yes
checking whether symlinkat handles trailing slash correctly... yes
checking for nlink_t... (cached) yes
checking whether fchmodat is declared without a macro... (cached) yes
checking whether fstat is declared without a macro... (cached) yes
checking whether fstatat is declared without a macro... (cached) yes
checking whether futimens is declared without a macro... (cached) yes
checking whether lchmod is declared without a macro... (cached) yes
checking whether lstat is declared without a macro... (cached) yes
checking whether mkdirat is declared without a macro... (cached) yes
checking whether mkfifo is declared without a macro... (cached) yes
checking whether mkfifoat is declared without a macro... (cached) yes
checking whether mknod is declared without a macro... (cached) yes
checking whether mknodat is declared without a macro... (cached) yes
checking whether stat is declared without a macro... (cached) yes
checking whether utimensat is declared without a macro... (cached) yes
checking whether localtime_r is declared... yes
checking whether localtime_r is compatible with its POSIX signature... yes
checking for timezone_t... no
checking whether tzset clobbers localtime buffer... no
checking whether chdir is declared without a macro... yes
checking whether chown is declared without a macro... yes
checking whether dup is declared without a macro... yes
checking whether dup2 is declared without a macro... yes
checking whether dup3 is declared without a macro... yes
checking whether environ is declared without a macro... yes
checking whether euidaccess is declared without a macro... yes
checking whether faccessat is declared without a macro... yes
checking whether fchdir is declared without a macro... yes
checking whether fchownat is declared without a macro... yes
checking whether fdatasync is declared without a macro... yes
checking whether fsync is declared without a macro... yes
checking whether ftruncate is declared without a macro... yes
checking whether getcwd is declared without a macro... yes
checking whether getdomainname is declared without a macro... yes
checking whether getdtablesize is declared without a macro... yes
checking whether getgroups is declared without a macro... yes
checking whether gethostname is declared without a macro... yes
checking whether getlogin is declared without a macro... yes
checking whether getlogin_r is declared without a macro... yes
checking whether getpagesize is declared without a macro... yes
checking whether getusershell is declared without a macro... yes
checking whether setusershell is declared without a macro... yes
checking whether endusershell is declared without a macro... yes
checking whether group_member is declared without a macro... yes
checking whether isatty is declared without a macro... yes
checking whether lchown is declared without a macro... yes
checking whether link is declared without a macro... yes
checking whether linkat is declared without a macro... yes
checking whether lseek is declared without a macro... yes
checking whether pipe is declared without a macro... yes
checking whether pipe2 is declared without a macro... yes
checking whether pread is declared without a macro... yes
checking whether pwrite is declared without a macro... yes
checking whether readlink is declared without a macro... yes
checking whether readlinkat is declared without a macro... yes
checking whether rmdir is declared without a macro... yes
checking whether sethostname is declared without a macro... yes
checking whether sleep is declared without a macro... yes
checking whether symlink is declared without a macro... yes
checking whether symlinkat is declared without a macro... yes
checking whether truncate is declared without a macro... yes
checking whether ttyname_r is declared without a macro... yes
checking whether unlink is declared without a macro... yes
checking whether unlinkat is declared without a macro... yes
checking whether usleep is declared without a macro... yes
checking whether unlink honors trailing slashes... yes
checking whether unlink of a parent directory fails as it should... guessing yes
checking for unsetenv... yes
checking for unsetenv() return type... int
checking whether unsetenv obeys POSIX... yes
checking whether utime is declared without a macro... yes
checking whether utimensat works... yes
checking for ptrdiff_t... yes
checking for vasprintf... yes
checking for vsnprintf... yes
checking whether snprintf respects a size of 1... (cached) yes
checking whether printf supports POSIX/XSI format strings with positions... (cached) yes
checking whether btowc is declared without a macro... yes
checking whether wctob is declared without a macro... yes
checking whether mbsinit is declared without a macro... yes
checking whether mbrtowc is declared without a macro... yes
checking whether mbrlen is declared without a macro... yes
checking whether mbsrtowcs is declared without a macro... yes
checking whether mbsnrtowcs is declared without a macro... yes
checking whether wcrtomb is declared without a macro... yes
checking whether wcsrtombs is declared without a macro... yes
checking whether wcsnrtombs is declared without a macro... yes
checking whether wcwidth is declared without a macro... yes
checking whether wmemchr is declared without a macro... yes
checking whether wmemcmp is declared without a macro... yes
checking whether wmemcpy is declared without a macro... yes
checking whether wmemmove is declared without a macro... yes
checking whether wmemset is declared without a macro... yes
checking whether wcslen is declared without a macro... yes
checking whether wcsnlen is declared without a macro... yes
checking whether wcscpy is declared without a macro... yes
checking whether wcpcpy is declared without a macro... yes
checking whether wcsncpy is declared without a macro... yes
checking whether wcpncpy is declared without a macro... yes
checking whether wcscat is declared without a macro... yes
checking whether wcsncat is declared without a macro... yes
checking whether wcscmp is declared without a macro... yes
checking whether wcsncmp is declared without a macro... yes
checking whether wcscasecmp is declared without a macro... yes
checking whether wcsncasecmp is declared without a macro... yes
checking whether wcscoll is declared without a macro... yes
checking whether wcsxfrm is declared without a macro... yes
checking whether wcsdup is declared without a macro... yes
checking whether wcschr is declared without a macro... yes
checking whether wcsrchr is declared without a macro... yes
checking whether wcscspn is declared without a macro... yes
checking whether wcsspn is declared without a macro... yes
checking whether wcspbrk is declared without a macro... yes
checking whether wcsstr is declared without a macro... yes
checking whether wcstok is declared without a macro... yes
checking whether wcswidth is declared without a macro... yes
checking whether wcsftime is declared without a macro... yes
checking whether mbrtowc handles incomplete characters... (cached) guessing yes
checking whether mbrtowc works as well as mbtowc... (cached) guessing yes
checking whether wcrtomb return value is correct... yes
checking whether iswcntrl works... (cached) yes
checking for towlower... (cached) yes
checking for wctype_t... (cached) yes
checking for wctrans_t... (cached) yes
checking whether wctype is declared without a macro... (cached) yes
checking whether iswctype is declared without a macro... (cached) yes
checking whether wctrans is declared without a macro... (cached) yes
checking whether towctrans is declared without a macro... (cached) yes
checking whether wcwidth is declared... (cached) yes
checking whether wcwidth works reasonably in UTF-8 locales... yes
checking for stdint.h... (cached) yes
checking whether time.h and sys/time.h may both be included... yes
checking for struct stat.st_blksize... yes
checking for library containing setsockopt... none required
checking for library containing setsockopt... (cached) none required
checking for sys/mtio.h... (cached) yes
checking which ioctl field to test for reversed bytes... mt_type
checking whether to build rmt... yes
checking for remote tape header files... yes
checking for sys/buf.h... (cached) no
checking for struct stat.st_blksize... (cached) yes
checking for library containing gethostbyname... none required
checking sys/xattr.h usability... yes
checking sys/xattr.h presence... yes
checking for sys/xattr.h... yes
checking for library containing getxattr... none required
checking for library containing fgetxattr... none required
checking for library containing lgetxattr... none required
checking for library containing setxattr... none required
checking for library containing fsetxattr... none required
checking for library containing lsetxattr... none required
checking for library containing listxattr... none required
checking for library containing flistxattr... none required
checking for library containing llistxattr... none required
checking whether getgrgid is declared... yes
checking whether getpwuid is declared... yes
checking whether time is declared... yes
checking for waitpid... yes
checking for remote shell... no
checking for netdb.h... (cached) yes
checking for default archive format... GNU
checking for default archive... -
checking for default blocking... 20
checking for default quoting style... escape
checking for ld used by gcc... /gnu/store/9ysmg2739n1ms84lx6hifncgc5l2hiy9-ld-wrapper-0/bin/ld
checking if the linker (/gnu/store/9ysmg2739n1ms84lx6hifncgc5l2hiy9-ld-wrapper-0/bin/ld) is GNU ld... yes
checking for shared library run path origin... done
checking for the common suffixes of directories in the library search path... lib,lib
checking for iconv... yes
checking for working iconv... yes
checking for iconv declaration... 
         extern size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
checking iconv.h usability... yes
checking iconv.h presence... yes
checking for iconv.h... yes
checking for iconv_t... yes
checking for a sed that does not truncate output... /gnu/store/lmfddplnplxd03bcqv3w9pynbnr1fp8k-sed-4.5/bin/sed
checking whether NLS is requested... yes
checking for msgfmt... no
checking for gmsgfmt... :
checking for xgettext... no
checking for msgmerge... no
checking for CFPreferencesCopyAppValue... no
checking for CFLocaleCopyCurrent... no
checking for GNU gettext in libc... yes
checking whether to use NLS... yes
checking where the gettext function comes from... libc
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating tests/Makefile
config.status: creating tests/atlocal
config.status: creating Makefile
config.status: creating doc/Makefile
config.status: creating gnu/Makefile
config.status: creating lib/Makefile
config.status: creating po/Makefile.in
config.status: creating scripts/Makefile
config.status: creating rmt/Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
config.status: executing tests/atconfig commands
configure: WARNING: unrecognized options: --enable-fast-install
phase `configure' succeeded after 33.8 seconds
starting phase `patch-generated-file-shebangs'
patch-makefile-SHELL: ./po/Makefile: changing `SHELL' from `/bin/sh' to `/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/sh'
phase `patch-generated-file-shebangs' succeeded after 0.1 seconds
starting phase `set-shell-file-name'
phase `set-shell-file-name' succeeded after 0.0 seconds
starting phase `build'
make  all-recursive
make[1]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30'
Making all in doc
make[2]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/doc'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/doc'
Making all in gnu
make[2]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/gnu'
  GEN      alloca.h
  GEN      dirent.h
  GEN      fcntl.h
  GEN      configmake.h
  GEN      getopt.h
  GEN      getopt-cdefs.h
  GEN      inttypes.h
  GEN      langinfo.h
  GEN      limits.h
  GEN      locale.h
  GEN      signal.h
  GEN      stdio.h
  GEN      stdlib.h
  GEN      selinux/selinux.h
  GEN      selinux/context.h
  GEN      string.h
  GEN      strings.h
  GEN      sys/stat.h
  GEN      time.h
  GEN      sys/time.h
  GEN      sys/types.h
  GEN      unistd.h
  GEN      uniwidth.h
  GEN      unitypes.h
  GEN      wchar.h
  GEN      wctype.h
make  all-recursive
make[3]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/gnu'
make[4]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/gnu'
  CC       acl-errno-valid.o
  CC       acl-internal.o
  CC       get-permissions.o
  CC       set-permissions.o
  CC       allocator.o
  CC       areadlink.o
  CC       areadlink-with-size.o
  CC       areadlinkat.o
  CC       areadlinkat-with-size.o
  CC       argmatch.o
  CC       argp-ba.o
  CC       argp-eexst.o
  CC       argp-fmtstream.o
  CC       argp-fs-xinl.o
  CC       argp-help.o
  CC       argp-parse.o
  CC       argp-pin.o
  CC       argp-pv.o
  CC       argp-pvh.o
  CC       argp-xinl.o
  CC       argp-version-etc.o
  CC       backupfile.o
  CC       backup-find.o
  CC       bitrotate.o
  CC       c-ctype.o
  CC       c-strcasecmp.o
  CC       c-strncasecmp.o
  CC       careadlinkat.o
  CC       cloexec.o
  CC       close-stream.o
  CC       closeout.o
  CC       opendir-safer.o
  CC       dirname.o
  CC       basename.o
  CC       dirname-lgpl.o
  CC       basename-lgpl.o
  CC       stripslash.o
  CC       exclude.o
  CC       exitfail.o
  CC       chmodat.o
  CC       chownat.o
  CC       fd-hook.o
  CC       fd-safer-flag.o
  CC       file-has-acl.o
  CC       dup-safer-flag.o
  CC       fdutimensat.o
  CC       filenamecat-lgpl.o
  CC       fprintftime.o
  CC       full-write.o
  CC       gettime.o
  CC       getprogname.o
  CC       hard-locale.o
  CC       hash.o
  CC       human.o
  CC       imaxtostr.o
  CC       inttostr.o
  CC       offtostr.o
  CC       uinttostr.o
  CC       umaxtostr.o
  CC       localcharset.o
  CC       malloca.o
  CC       mbchar.o
  CC       mbscasecmp.o
  CC       mbuiter.o
  CC       modechange.o
  CC       nstrftime.o
  CC       openat-die.o
  CC       parse-datetime.o
  CC       priv-set.o
  CC       progname.o
  CC       quotearg.o
  CC       renameat2.o
  CC       safe-read.o
  CC       safe-write.o
  CC       save-cwd.o
  CC       savedir.o
  CC       se-context.o
  CC       se-selinux.o
  CC       stat-time.o
  CC       statat.o
  CC       strnlen1.o
  CC       tempname.o
  CC       timespec.o
  CC       timespec-sub.o
  CC       unistd.o
  CC       dup-safer.o
  CC       fd-safer.o
  CC       pipe-safer.o
  CC       unlinkdir.o
  CC       utimens.o
  CC       version-etc.o
  CC       version-etc-fsf.o
  CC       xmalloc.o
  CC       wctype-h.o
  CC       xalloc-die.o
  CC       xgetcwd.o
  CC       xsize.o
  CC       xstrndup.o
  CC       xstrtol.o
  CC       xstrtoul.o
  CC       xstrtol-error.o
  CC       xstrtoumax.o
  CC       xvasprintf.o
  CC       xasprintf.o
  CC       asnprintf.o
  CC       chdir-long.o
  CC       fcntl.o
  CC       getopt.o
  CC       getopt1.o
  CC       localtime-buffer.o
  CC       mbrtowc.o
  CC       mktime.o
  CC       obstack.o
  CC       openat-proc.o
  CC       printf-args.o
  CC       printf-parse.o
  CC       selinux-at.o
  CC       time_rz.o
  CC       vasnprintf.o
  GEN      charset.alias
  GEN      ref-add.sed
  GEN      ref-del.sed
  CC       uniwidth/width.o
  AR       libgnu.a
make[4]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/gnu'
make[3]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/gnu'
make[2]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/gnu'
Making all in lib
make[2]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/lib'
  GEN      rmt-command.h
make  all-am
make[3]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/lib'
  CC       paxerror.o
  CC       paxexit-status.o
  CC       paxnames.o
  CC       wordsplit.o
  CC       rtapelib.o
  CC       stdopen.o
  CC       xattr-at.o
  AR       libtar.a
make[3]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/lib'
make[2]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/lib'
Making all in rmt
make[2]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/rmt'
  CC       rmt.o
  CCLD     rmt
make[2]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/rmt'
Making all in src
make[2]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/src'
  CC       buffer.o
  CC       delete.o
  CC       checkpoint.o
  CC       compare.o
  CC       create.o
  CC       exit.o
  CC       exclist.o
  CC       extract.o
  CC       xheader.o
  CC       incremen.o
  CC       list.o
  CC       map.o
  CC       misc.o
  CC       names.o
  CC       sparse.o
  CC       suffix.o
  CC       system.o
  CC       tar.o
  CC       transform.o
  CC       unlink.o
  CC       update.o
  CC       utf8.o
  CC       warning.o
  CC       xattrs.o
  CCLD     tar
make[2]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/src'
Making all in scripts
make[2]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/scripts'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/scripts'
Making all in po
make[2]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/po'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/po'
Making all in tests
make[2]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/tests'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/tests'
make[2]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30'
make[2]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30'
make[1]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30'
phase `build' succeeded after 5.8 seconds
starting phase `check'
Making check in doc
make[1]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/doc'
make[1]: Nothing to be done for 'check'.
make[1]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/doc'
Making check in gnu
make[1]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/gnu'
make  check-recursive
make[2]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/gnu'
make[3]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/gnu'
make[3]: Nothing to be done for 'check-am'.
make[3]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/gnu'
make[2]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/gnu'
make[1]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/gnu'
Making check in lib
make[1]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/lib'
make  check-am
make[2]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/lib'
make[2]: Nothing to be done for 'check-am'.
make[2]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/lib'
make[1]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/lib'
Making check in rmt
make[1]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/rmt'
make[1]: Nothing to be done for 'check'.
make[1]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/rmt'
Making check in src
make[1]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/src'
make[1]: Nothing to be done for 'check'.
make[1]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/src'
Making check in scripts
make[1]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/scripts'
make[1]: Nothing to be done for 'check'.
make[1]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/scripts'
Making check in po
make[1]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/po'
make[1]: Nothing to be done for 'check'.
make[1]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/po'
Making check in tests
make[1]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/tests'
make  genfile checkseekhole ckmtime
make[2]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/tests'
  CC       genfile.o
  CC       argcv.o
  CC       checkseekhole.o
  CC       ckmtime.o
  CCLD     checkseekhole
  CCLD     ckmtime
  CCLD     genfile
make[2]: Leaving directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/tests'
make  check-local
make[2]: Entering directory '/tmp/guix-build-tar-1.30.drv-0/tar-1.30/tests'
/gnu/store/q19l04vd2za80mk1845pz7r8cz29qk43-bash-minimal-4.4.23/bin/bash ./testsuite -k '!link mismatch,!directory removed before reading,!explicitly named directory removed before reading'
## ------------------------ ##
## GNU tar 1.30 test suite. ##
## ------------------------ ##
  1: tar version                                     ok
  2: decompressing from stdin                        ok
  3: mixing options                                  ok
  4: interspersed options                            ok
  5: TAR_OPTIONS with string arguments               ok

Option compatibility

  6: occurrence compatibility                        ok
  7: occurrence compatibility                        ok
  8: --verify compatibility                          ok
  9: compress option compatibility                   ok
 10: --pax-option compatibility                      ok
 11: --pax-option compatibility                      skipped (opcomp06.at:24)

Positional options

 12: Exclude                                         ok
 13: Directory                                       ok
 14: Several options                                 ok
 15: The --add-file option                           ok

The -T option

 16: multiple file lists                             ok
 17: nested file lists                               ok
 18: recursive file lists                            ok
 19: files-from & recurse: toggle                    ok
 20: toggle --recursion (not) from -T                ok
 21: -C in file lists                                ok
 22: empty entries                                   ok
 23: 0-separated file without -0                     ok
 24: --null enables verbatim reading                 ok
 25: empty file                                      ok
 26: entries with missing newlines                   ok
 27: recursive extraction from --files-from          ok
 28: trailing slash in --files-from                  ok

Various options

 29: tar --index-file=FILE --file=-                  ok
 30: tar cvf -                                       ok
 31: gzip                                            ok
 32: recurse                                         ok
 33: recurse: toggle                                 ok
 34: short records                                   ok
 35: --numeric-owner basic tests                     ok

The --same-order option

 36: working -C with --same-order                    ok
 37: multiple -C options                             ok

Append

 38: append                                          ok
 39: appending files with long names                 ok
 40: append vs. create                               ok
 41: append with name transformation                 ok
 42: append with verify                              ok
 43: append after changed blocking                   ok

Transforms

 44: transforming hard links on create               ok
 45: transformations and GNU volume labels           ok
 46: transforming escaped delimiters on create       ok
 47: transforming hard link targets                  ok

Exclude

 48: exclude                                         ok
 49: exclude wildcards                               ok
 50: exclude: anchoring                              ok
 51: exclude: wildcards match slash                  ok
 52: exclude: case insensitive                       ok
 53: exclude: lots of excludes                       ok
 54: exclude: long files in pax archives             ok
 55: exclude: --exclude-backups option               ok
 56: --exclude-tag option                            ok
 57: --exclude-tag option and --listed-incremental   ok
 58: --exclude-tag option in incremental pass        ok
 59: --exclude-tag-under option                      ok
 60: --exclude-tag-under and --listed-incremental    ok
 61: --exclude-tag-under option in incremental pass  ok
 62: --exclude-tag-all option                        ok
 63: --exclude-tag-all and --listed-incremental      ok
 64: --exclude-tag-all option in incremental pass    ok

Deletions

 65: deleting a member after a big one               ok
 66: deleting a member from stdin archive            ok
 67: deleting members with long names                ok
 68: deleting a large last member                    ok
 69: deleting non-existing member                    ok

Extracting

 70: extract over an existing directory              ok
 71: extracting symlinks over an existing file       ok
 72: extraction loops                                ok
 73: extract + fnmatch                               ok
 74: extracting selected members from pax            ok
 75: mode of extracted directories                   ok
 76: extracting symlinks to a read-only dir          ok
 77: restoring mode on existing directory            ok
 78: extracting even when . and .. are unreadable    ok
 79: -C and delayed setting of metadata              ok
 80: scarce file descriptors                         ok
 81: extract dot permissions                         ok
 82: extract over symlinks                           ok
 83: extract -C symlink                              ok
 84: extract parent mkdir failure                    ok
 85: extract empty directory with -C                 ok
 86: name matching/transformation ordering           ok
 87: keep-old-files                                  ok
 88: skip-old-files                                  ok
 89: keep-directory-symlink                          ok
 90: delay-directory-restore                         ok
 91: extracting existing dir with --backup           ok

Volume label operations

 93: single-volume label                             ok
 94: multi-volume label                              ok
 95: test-label option                               ok
 96: label with non-create option                    ok
 97: label with non-create option                    ok

Incremental archives

 98: incremental                                     ok
 99: restore broken symlinks from incremental        ok
100: restoring timestamps from incremental           ok
101: --listed for individual files                   ok
102: working --listed                                ok
103: incremental dump when the parent directory is unreadable ok
104: --listed-incremental and --one-file-system      ok
105: --listed-incremental and remounted directories  skipped (listed05.at:36)
106: renamed files in incrementals                   ok
107: proper icontents initialization                 ok
108: incremental dumps with -C                       ok
109: incremental dumps of nested directories         ok
110: incremental restores with -C                    ok
111: filename normalization                          ok
112: incremental with alternating -C                 ok
113: concatenated incremental archives (deletes)     ok
114: concatenated incremental archives (renames)     ok

Files removed while archiving

115: file removed as we read it (ca. 22 seconds)     ok
116: toplevel file removed (ca. 24 seconds)          ok

Renames

119: renamed dirs in incrementals                    ok
120: move between hierarchies                        ok
121: cyclic renames                                  ok
122: renamed directory containing subdirectories     ok
123: renamed subdirectories                          ok
124: changed file types in incrementals              ok

Ignore failing reads

125: ignfail                                         ok

Link handling

126: link count gt 2                                 ok
127: preserve hard links with --remove-files         ok
128: working -l with --remove-files                  ok
129: link count is 1 but multiple occurrences        ok

Specific archive formats

130: long names in V7 archives                       ok
131: long file names divisible by block size         ok
132: ustar: unsplittable file name                   ok
133: ustar: unsplittable path name                   ok
134: ustar: splitting long names                     ok
135: old archives                                    ok
136: time: tricky time stamps                        ok
137: time: clamping mtime                            ok

Multivolume archives

138: multivolume dumps from pipes                    ok
139: skipping a straddling member                    ok
140: MV archive & long filenames                     ok
141: split directory members in a MV archive         ok
142: Restoring after an out of sync volume           ok
143: Multivolumes with L=record_size                 ok
144: volumes split at an extended header             skipped (multiv07.at:31)
145: multivolume header creation                     ok
146: bad next volume                                 ok
147: file start at the beginning of a posix volume   ok

Owner and Groups

148: --owner and --group                             ok
149: --owner-map and --group-map                     ok

Sparse files

150: sparse files                                    ok
151: extracting sparse file over a pipe              ok
152: storing sparse files > 8G                       ok
153: storing long sparse file names                  ok

@wtogami
Copy link
Contributor

wtogami commented Mar 1, 2019

https://www.gnu.org/software/guix/manual/en/guix.html#The-GCC-toolchain
"Guix offers individual compiler packages such as gcc but if you are in need of a complete toolchain for compiling and linking source code what you really want is the gcc-toolchain package. This package provides a complete GCC toolchain for C/C++ development, including GCC itself, the GNU C Library (headers and binaries, plus debugging symbols in the debug output), Binutils, and a linker wrapper.
The wrapper’s purpose is to inspect the -L and -l switches passed to the linker, add corresponding -rpath arguments, and invoke the actual linker with this new set of arguments. By default, the linker wrapper refuses to link to libraries outside the store to ensure “purity”. This can be annoying when using the toolchain to link with local libraries. To allow references to libraries outside the store you need to define the environment variable GUIX_LD_WRAPPER_ALLOW_IMPURITIES.

It's very bad practice to ship binaries with -rpath. Carl got rid of it with patchelf --remove-rpath but it still has a problem with the interpreter. Carl noted,"So everything works except the interpreter, because the interpreter path is different for different architectures. So I don't wanna just do patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 or sth like that."

I'm not really sure how this works where you normally don't need to explicitly specify where to find the interpreter.

@theuni
Copy link
Member

theuni commented Mar 1, 2019

(@wtogami asked me to weigh in on his comment above, I haven't read the history here)

If the guix environment uses some wonky path to the runtime loader, an alternative one can be set
when linking using -Wl,--dynamic-linker=Foo, where Foo is the more generic path for that arch. That of course means that the binaries won't run in guix by default anymore. Fun trick, though, I believe you can use the loader as a launcher for a binary if its loader path is busted.

For example, this should work in a non-guix environment. It used to, anyway:
/lib64/ld-linux-x86-64.so.2 ./my_guix_binary

There shouldn't be any need to modify a binary after the fact. Imo doing so is brittle and indicative that something is wrong/missing. If the toolchain can't do what's needed, let's make sure that any temporary hacks are paired with upstream bug reports and/or patches.

@wtogami
Copy link
Contributor

wtogami commented Mar 3, 2019

For example, this should work in a non-guix environment. It used to, anyway:
/lib64/ld-linux-x86-64.so.2 ./my_guix_binary
There shouldn't be any need to modify a binary after the fact. Imo doing so is brittle and indicative that something is wrong/missing. If the toolchain can't do what's needed, let's make sure that any temporary hacks are paired with upstream bug reports and/or patches

I think we are using guix not in way it was intended so they may not accept an upstream ticket to accommodate our use case?

I think this one hack to explicitly specify the standard loader path may be acceptable for our build process. Could also symlink that one library within guix's filesystem.

laanwj added a commit that referenced this pull request Jul 12, 2019
751549b contrib: guix: Additional clarifications re: substitutes (Carl Dong)
cd3e947 contrib: guix: Various improvements. (Carl Dong)
8dff3e4 contrib: guix: Clarify SOURCE_DATE_EPOCH. (Carl Dong)
3e80ec3 contrib: Add deterministic Guix builds. (Carl Dong)

Pull request description:

  ~~**This post is kept updated as this project progresses. Use this [latest update link](#15277 (comment)) to see what's new.**~~

  Please read the `README.md`.

  -----

  ### Guix Introduction

  This PR enables building bitcoin in Guix containers. [Guix](https://www.gnu.org/software/guix/manual/en/html_node/Features.html) is a transactional package manager much like Nix, but unlike Nix, it has more of a focus on [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) and [reproducibility](https://www.gnu.org/software/guix/blog/tags/reproducible-builds/) which are attractive for security-sensitive projects like bitcoin.

  ### Guix Build Walkthrough

  Please read the `README.md`.

  [Old instructions no. 4](#15277 (comment))

  [Old instructions no. 3](#15277 (comment))

  [Old instructions no. 2](#15277 (comment))

  <details>
  <summary>Old instructions no. 1</summary>
  In this PR, we define a Guix [manifest](https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-package.html#profile_002dmanifest) in `contrib/guix/manifest.scm`, which declares what packages we want in our environment.

  We can then invoke
  ```
  guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```
  To have Guix:
  1. Build an environment containing the packages we defined in our `contrib/guix/manifest.scm` manifest from the Guix bootstrap binaries (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) for more details).
  2. Start a container with that environment that has no network access, and no access to the host's filesystem except to the `pwd` that it was started in.
  3. Drop you into a shell in that container.

  > Note: if you don't want to wait hours for Guix to build the entire world from scratch, you can eliminate the `--no-substitutes` option to have Guix download from available binary sources. Note that this convenience doesn't necessarily compromise your security, as you can check that a package was built correctly after the fact using `guix build --check <packagename>`

  Therefore, we can perform a build of bitcoin much like in Gitian by invoking the following:

  ```
  make -C depends -j"$(nproc)" download && \
      cat contrib/guix/build.sh | guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```

  We don't include `make -C depends -j"$(nproc)" download` inside `contrib/guix/build.sh` because `contrib/guix/build.sh` is run inside the container, which has no network access (which is a good thing).
  </details>

  ### Rationale

  I believe that this represents a substantial improvement for the "supply chain security" of bitcoin because:

  1. We no longer have to rely on Ubuntu for our build environment for our releases ([oh the horror](https://github.com/bitcoin/bitcoin/blob/72bd4ab867e3be0d8410403d9641c08288d343e3/contrib/gitian-descriptors/gitian-linux.yml#L10)), because Guix builds everything about the container, we can perform this on almost any Linux distro/system.
  2. It is now much easier to determine what trusted binaries are in our supply chain, and even make a nice visualization! (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html)).
  3. There is active effort among Guix folks to minimize the number of trusted binaries even further. OriansJ's [stage0](https://github.com/oriansj/stage0), and janneke's [Mes](https://www.gnu.org/software/mes/) all aim to achieve [reduced binary boostrap](http://joyofsource.com/reduced-binary-seed-bootstrap.html) for Guix. In fact, I believe if OriansJ gets his way, we will end up some day with only a single trusted binary: hex0 (a ~500 byte self-hosting hex assembler).

  ### Steps to Completion

  - [x] Successfully build bitcoin inside the Guix environment
  - [x] Make `check-symbols` pass
  - [x] Do the above but without nasty hacks
  - [x] Solve some of the more innocuous hacks
  - [ ] Make it cross-compile (HELP WANTED HERE)
    - [x] Linux
      - [x] x86_64-linux-gnu
      - [x] i686-linux-gnu
      - [x] aarch64-linux-gnu
      - [x] arm-linux-gnueabihf
      - [x] riscv64-linux-gnu
    - [ ] OS X
      - [ ] x86_64-apple-darwin14
    - [ ] Windows
      - [ ] x86_64-w64-mingw32
  - [ ] Maybe make importer for depends syntax
  - [ ] Document build process for future releases
  - [ ] Extra: Pin the revision of Guix that we build with with Guix [inferiors](https://www.gnu.org/software/guix/manual/en/html_node/Inferiors.html)

  ### Help Wanted

  [Old content no. 3](#15277 (comment))

  [Old content no. 2](#15277 (comment))

  <details>
  <summary>Old content no. 1</summary>
  As of now, the command described above to perform a build of bitcoin a lot like Gitian works, but fails at the `check-symbols` stage. This is because a few dynamic libraries are linked in that shouldn't be.

  Here's what `ldd src/bitcoind` looks like when built in a Guix container:
  ```
  	linux-vdso.so.1 (0x00007ffcc2d90000)
  	libdl.so.2 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libdl.so.2 (0x00007fb7eda09000)
  	librt.so.1 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/librt.so.1 (0x00007fb7ed9ff000)
  	libstdc++.so.6 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libstdc++.so.6 (0x00007fb7ed87c000)
  	libpthread.so.0 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libpthread.so.0 (0x00007fb7ed85b000)
  	libm.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libm.so.6 (0x00007fb7ed6da000)
  	libgcc_s.so.1 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libgcc_s.so.1 (0x00007fb7ed6bf000)
  	libc.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libc.so.6 (0x00007fb7ed506000)
  	/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fb7ee3a0000)
  ```

  And here's what it looks in one of our releases:
  ```
  	linux-vdso.so.1 (0x00007ffff52cd000)
  	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f87726b4000)
  	librt.so.1 => /usr/lib/librt.so.1 (0x00007f87726aa000)
  	libm.so.6 => /usr/lib/libm.so.6 (0x00007f8772525000)
  	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f877250b000)
  	libc.so.6 => /usr/lib/libc.so.6 (0x00007f8772347000)
  	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f8773392000)
  ```

  ~~I suspect it is because my script does not apply the gitian-input patches [described in the release process](https://github.com/bitcoin/bitcoin/blob/master/doc/release-process.md#fetch-and-create-inputs-first-time-or-when-dependency-versions-change) but there is no description as to how these patches are applied.~~ It might also be something else entirely.

  Edit: It is something else. It appears that the gitian inputs are only used by [`gitian-win-signer.yml`](https://github.com/bitcoin/bitcoin/blob/d6e700e40f861ddd6743f4d13f0d6f6bc19093c2/contrib/gitian-descriptors/gitian-win-signer.yml#L14)
  </details>

  ### How to Help

  1. Install Guix on your distro either [from source](https://www.gnu.org/software/guix/manual/en/html_node/Requirements.html) or perform a [binary installation](https://www.gnu.org/software/guix/manual/en/html_node/Binary-Installation.html#Binary-Installation)
  2. Try out my branch and the command described above!

ACKs for top commit:
  MarcoFalke:
    Thanks for the replies. ACK 751549b
  laanwj:
    ACK 751549b

Tree-SHA512: 50e6ab58c6bda9a67125b6271daf7eff0ca57d0efa8941ed3cd951e5bf78b31552fc5e537b1e1bcf2d3cc918c63adf19d685aa117a0f851024dc67e697890a8d
@BrannonKing
Copy link

For compilation of LBRY (a bitcoin derivative), I've been using the "depends" stuff to handle the cross-compilation (linux, windows, darwin). I've got a Docker image that has the necessary build dependencies, which single image runs all three cross-platform builds. It has been working quite well (after a few tweaks to the depends stuff). In particular, I changed it to use the system Clang instead of downloading one as part of the build for darwin. That particular feature may help you with the guix cross-platform compilation. I've compiled the linux target with Clang from time to time as well; it works fine but you have to modify the boost.mk to have it use the clang toolset. (To support cross-compile to darwin you're buying into clang anyhow.) For some ideas, you can do a diff to bitcoin on the "depends" and "packaging" folders from here: https://github.com/lbryio/lbrycrd . You can use Clang to cross-compile to Windows as well, but it requires a stand-alone package of Windows headers & libs -- similar to what we do for the OSX SDK in the "depends" system. I haven't gone down that road.

@dongcarl
Copy link
Contributor Author

dongcarl commented Jul 12, 2019

@BrannonKing

For compilation of LBRY (a bitcoin derivative), I've been using the "depends" stuff to handle the cross-compilation (linux, windows, darwin). I've got a Docker image that has the necessary build dependencies, which single image runs all three cross-platform builds. It has been working quite well (after a few tweaks to the depends stuff).

Good to know "depends" works for others as well!

In particular, I changed it to use the system Clang instead of downloading one as part of the build for darwin. That particular feature may help you with the guix cross-platform compilation.

Very cool! This is a real problem that I haven't gotten around to solving, but glad you did! I will check out the diff!

You can use Clang to cross-compile to Windows as well, but it requires a stand-alone package of Windows headers & libs -- similar to what we do for the OSX SDK in the "depends" system. I haven't gone down that road.

Good to know! I'll definitely look into this if mingw doesn't end up working as well as I hope haha.

@hebasto
Copy link
Member

hebasto commented Jul 12, 2019

$ git rev-parse HEAD
751549b52a9a4cd27389d807ae67f02bbb39cd7f
$ find output/ -type f -print0 | sort -z | xargs -r0 sha256sum
66dfb1fbf949128793dac184c68dee407ae56d3cc4d4f0f92b1df2146267446e  output/bitcoin-0.18.99-aarch64-linux-gnu-debug.tar.gz
e5f46d3548f5cb456496ad9d1c560443143b879bd92f946a286985eace99add1  output/bitcoin-0.18.99-aarch64-linux-gnu.tar.gz
96d5f690350c5eeb27fa4f7ed6165006aea5e9039e54420f1d8dace92e2155f6  output/bitcoin-0.18.99-arm-linux-gnueabihf-debug.tar.gz
e224ba56022f34138006ea0d1e00e83d3f44af3bb0fc886bf1f2d15d9b68cba4  output/bitcoin-0.18.99-arm-linux-gnueabihf.tar.gz
adda0b3b4f942c7750fead6811b2e85c35a6f0da94170bcc39e529c4bbc1da6c  output/bitcoin-0.18.99-i686-linux-gnu-debug.tar.gz
2e5a9a40bbc802c4360bb0b68675d7e63350d2ea426a71152cb158fcee13ef75  output/bitcoin-0.18.99-i686-linux-gnu.tar.gz
d97d447c0418e5dac4f25251e72b20466e1b8ee90284c69849a5a248929dbe0c  output/bitcoin-0.18.99-riscv64-linux-gnu-debug.tar.gz
66f5389e0038f702d2965faed6d0f88242ab66dc3f4d7ec987e3c4a1d4a9855c  output/bitcoin-0.18.99-riscv64-linux-gnu.tar.gz
256c6ecfd58175dba8720597966dceb4b6322204098be59df289a1d641741e00  output/bitcoin-0.18.99-x86_64-linux-gnu-debug.tar.gz
43cd87bab9b31262898c1e6fafc9f66a3aaeb7bea566316686f0c54adc19781e  output/bitcoin-0.18.99-x86_64-linux-gnu.tar.gz
9aaad700c36273a1ac73a4465b4dc6f49085c7b329aba108585a1e37ee03d913  output/src/bitcoin-0.18.99.tar.gz

@fanquake
Copy link
Member

Ran a final build. Seeing hashes that match @hebasto.

bash-5.0# env PATH="/root/.config/guix/current/bin${PATH:+:}$PATH" guix describe
Generation 2	Jul 12 2019 05:09:23	(current)
  guix 82c77e5
    repository URL: https://github.com/dongcarl/guix.git
    branch: 2019-05-bitcoin-staging
    commit: 82c77e52b8b46e0a3aad2cb12307c2e30547deec
bash-5.0# git rev-parse HEAD
751549b52a9a4cd27389d807ae67f02bbb39cd7f
bash-5.0# find output/ -type f -print0 | sort -z | xargs -r0 sha256sum
66dfb1fbf949128793dac184c68dee407ae56d3cc4d4f0f92b1df2146267446e  output/bitcoin-0.18.99-aarch64-linux-gnu-debug.tar.gz
e5f46d3548f5cb456496ad9d1c560443143b879bd92f946a286985eace99add1  output/bitcoin-0.18.99-aarch64-linux-gnu.tar.gz
96d5f690350c5eeb27fa4f7ed6165006aea5e9039e54420f1d8dace92e2155f6  output/bitcoin-0.18.99-arm-linux-gnueabihf-debug.tar.gz
e224ba56022f34138006ea0d1e00e83d3f44af3bb0fc886bf1f2d15d9b68cba4  output/bitcoin-0.18.99-arm-linux-gnueabihf.tar.gz
adda0b3b4f942c7750fead6811b2e85c35a6f0da94170bcc39e529c4bbc1da6c  output/bitcoin-0.18.99-i686-linux-gnu-debug.tar.gz
2e5a9a40bbc802c4360bb0b68675d7e63350d2ea426a71152cb158fcee13ef75  output/bitcoin-0.18.99-i686-linux-gnu.tar.gz
d97d447c0418e5dac4f25251e72b20466e1b8ee90284c69849a5a248929dbe0c  output/bitcoin-0.18.99-riscv64-linux-gnu-debug.tar.gz
66f5389e0038f702d2965faed6d0f88242ab66dc3f4d7ec987e3c4a1d4a9855c  output/bitcoin-0.18.99-riscv64-linux-gnu.tar.gz
256c6ecfd58175dba8720597966dceb4b6322204098be59df289a1d641741e00  output/bitcoin-0.18.99-x86_64-linux-gnu-debug.tar.gz
43cd87bab9b31262898c1e6fafc9f66a3aaeb7bea566316686f0c54adc19781e  output/bitcoin-0.18.99-x86_64-linux-gnu.tar.gz
9aaad700c36273a1ac73a4465b4dc6f49085c7b329aba108585a1e37ee03d913  output/src/bitcoin-0.18.99.tar.gz

@practicalswift
Copy link
Contributor

practicalswift commented Jul 22, 2019

Strangely I'm not getting the same hashes as @fanquake and @hebasto when running:

$ guix pull --url=https://github.com/dongcarl/guix.git --commit=82c77e52b8b46e0a3aad2cb12307c2e30547deec --max-jobs=12
guile: warning: failed to install locale
Updating channel 'guix' from Git repository at 'https://github.com/dongcarl/guix.git'...
Building from this channel:
  guix      https://github.com/dongcarl/guix.git        82c77e5
Computing Guix derivation for 'x86_64-linux'...
nothing to be done
$ guix --version
guile: warning: failed to install locale
guix (GNU Guix) 82c77e52b8b46e0a3aad2cb12307c2e30547deec
Copyright (C) 2019 the Guix authors
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ git clone -q https://github.com/bitcoin/bitcoin
$ cd bitcoin
$ git fetch origin pull/15277/head:2019-01-guix
From https://github.com/bitcoin/bitcoin
 * [new ref]             refs/pull/15277/head -> 2019-01-guix
$ git checkout 2019-01-guix
Switched to branch '2019-01-guix'
$ git rev-parse HEAD
751549b52a9a4cd27389d807ae67f02bbb39cd7f
$ contrib/guix/guix-build.sh
…
$ find output/ -type f -print0 | sort -z | xargs -r0 sha256sum
6e26f21c48ea0acd564c5779be8ba7325f96616eaafa573c79669fc81033867b  output/bitcoin-0.18.99-aarch64-linux-gnu-debug.tar.gz
b3b7700eaca5eb032187e9fab6e057c9afb27a0f69ac22568fbf4c3c9885ad01  output/bitcoin-0.18.99-aarch64-linux-gnu.tar.gz
baa4f0461ed505e4993f832452659828a65a2da4247e40f3992e923c46798a29  output/bitcoin-0.18.99-arm-linux-gnueabihf-debug.tar.gz
40eaa54b14df6c00f7451cea9418b92f84555e3094057ee76a3aa4e505461aa0  output/bitcoin-0.18.99-arm-linux-gnueabihf.tar.gz
3407730d8ce02074c243c461a5edd86e651527a6d2b1f77f920e0c2030939d5f  output/bitcoin-0.18.99-i686-linux-gnu-debug.tar.gz
0ab534959d6e42ed86bc0700cd3a91838b28d7a0ab04c93a984096fba0e8595c  output/bitcoin-0.18.99-i686-linux-gnu.tar.gz
2a20b8e067d27e16e816f9c63f3f0a2ab6d31a8273bd28ec0aafe4080f9c0dd3  output/bitcoin-0.18.99-riscv64-linux-gnu-debug.tar.gz
9c0476e9d076dd05951940626a3bc2ddae8318649aade3b10c7772e74175bbcb  output/bitcoin-0.18.99-riscv64-linux-gnu.tar.gz
ef659978bfea35847b1c7501a5e45d26c7371349301e606a9242842593b4e5e4  output/bitcoin-0.18.99-x86_64-linux-gnu-debug.tar.gz
e3f11e3c9f5693753708ada5950c6d681200902c2372fcff7d3894855ba3d5f8  output/bitcoin-0.18.99-x86_64-linux-gnu.tar.gz
4fd545fcd5c321b7a93d8eac0d2b2a897d8fdd08f40ff62d4f4f9de9f9a57eb2  output/src/bitcoin-0.18.99.tar.gz

@practicalswift
Copy link
Contributor

Sorry, I missed passing --branch=2019-05-bitcoin-staging to guix pull.

I'll re-try building.

@practicalswift
Copy link
Contributor

FWIW, specifying --branch=2019-05-bitcoin-staging did not solve the issue.

I'm still not getting the hashes observed by @fanquake and @hebasto:

$ guix pull --url=https://github.com/dongcarl/guix.git \
    --commit=82c77e52b8b46e0a3aad2cb12307c2e30547deec \
    --branch=2019-05-bitcoin-staging --max-jobs=12
…
$ guix describe
Generation 8    Jul 22 2019 12:22:36    (current)
  guix 82c77e5
    repository URL: https://github.com/dongcarl/guix.git
    branch: 2019-05-bitcoin-staging
    commit: 82c77e52b8b46e0a3aad2cb12307c2e30547deec
$ guix --version
guix (GNU Guix) 82c77e52b8b46e0a3aad2cb12307c2e30547deec
Copyright (C) 2019 the Guix authors
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ git clone -q https://github.com/bitcoin/bitcoin
$ cd bitcoin
$ git fetch origin pull/15277/head:2019-01-guix
$ git checkout 2019-01-guix
$ git rev-parse HEAD
751549b52a9a4cd27389d807ae67f02bbb39cd7f
$ contrib/guix/guix-build.sh
$ find output/ -type f -print0 | sort -z | xargs -r0 sha256sum
6e26f21c48ea0acd564c5779be8ba7325f96616eaafa573c79669fc81033867b  output/bitcoin-0.18.99-aarch64-linux-gnu-debug.tar.gz
b3b7700eaca5eb032187e9fab6e057c9afb27a0f69ac22568fbf4c3c9885ad01  output/bitcoin-0.18.99-aarch64-linux-gnu.tar.gz
baa4f0461ed505e4993f832452659828a65a2da4247e40f3992e923c46798a29  output/bitcoin-0.18.99-arm-linux-gnueabihf-debug.tar.gz
40eaa54b14df6c00f7451cea9418b92f84555e3094057ee76a3aa4e505461aa0  output/bitcoin-0.18.99-arm-linux-gnueabihf.tar.gz
3407730d8ce02074c243c461a5edd86e651527a6d2b1f77f920e0c2030939d5f  output/bitcoin-0.18.99-i686-linux-gnu-debug.tar.gz
0ab534959d6e42ed86bc0700cd3a91838b28d7a0ab04c93a984096fba0e8595c  output/bitcoin-0.18.99-i686-linux-gnu.tar.gz
2a20b8e067d27e16e816f9c63f3f0a2ab6d31a8273bd28ec0aafe4080f9c0dd3  output/bitcoin-0.18.99-riscv64-linux-gnu-debug.tar.gz
9c0476e9d076dd05951940626a3bc2ddae8318649aade3b10c7772e74175bbcb  output/bitcoin-0.18.99-riscv64-linux-gnu.tar.gz
ef659978bfea35847b1c7501a5e45d26c7371349301e606a9242842593b4e5e4  output/bitcoin-0.18.99-x86_64-linux-gnu-debug.tar.gz
e3f11e3c9f5693753708ada5950c6d681200902c2372fcff7d3894855ba3d5f8  output/bitcoin-0.18.99-x86_64-linux-gnu.tar.gz
4fd545fcd5c321b7a93d8eac0d2b2a897d8fdd08f40ff62d4f4f9de9f9a57eb2  output/src/bitcoin-0.18.99.tar.gz

@dongcarl
Copy link
Contributor Author

dongcarl commented Jul 23, 2019

@practicalswift Oh! That's interesting... The files are a little big, but could you at least send me output/src/bitcoin-0.18.99.tar.gz and maybe one of the other tarballs?

A local build shows that I'm matching you... So perhaps either @fanquake or @hebasto can upload their tarballs?

@practicalswift
Copy link
Contributor

practicalswift commented Jul 31, 2019

Did we arrive at any conclusion regarding the expected hashes?

FWIW I'm consistently getting:

6e26f21c48ea0acd564c5779be8ba7325f96616eaafa573c79669fc81033867b  output/bitcoin-0.18.99-aarch64-linux-gnu-debug.tar.gz
b3b7700eaca5eb032187e9fab6e057c9afb27a0f69ac22568fbf4c3c9885ad01  output/bitcoin-0.18.99-aarch64-linux-gnu.tar.gz
baa4f0461ed505e4993f832452659828a65a2da4247e40f3992e923c46798a29  output/bitcoin-0.18.99-arm-linux-gnueabihf-debug.tar.gz
40eaa54b14df6c00f7451cea9418b92f84555e3094057ee76a3aa4e505461aa0  output/bitcoin-0.18.99-arm-linux-gnueabihf.tar.gz
3407730d8ce02074c243c461a5edd86e651527a6d2b1f77f920e0c2030939d5f  output/bitcoin-0.18.99-i686-linux-gnu-debug.tar.gz
0ab534959d6e42ed86bc0700cd3a91838b28d7a0ab04c93a984096fba0e8595c  output/bitcoin-0.18.99-i686-linux-gnu.tar.gz
2a20b8e067d27e16e816f9c63f3f0a2ab6d31a8273bd28ec0aafe4080f9c0dd3  output/bitcoin-0.18.99-riscv64-linux-gnu-debug.tar.gz
9c0476e9d076dd05951940626a3bc2ddae8318649aade3b10c7772e74175bbcb  output/bitcoin-0.18.99-riscv64-linux-gnu.tar.gz
ef659978bfea35847b1c7501a5e45d26c7371349301e606a9242842593b4e5e4  output/bitcoin-0.18.99-x86_64-linux-gnu-debug.tar.gz
e3f11e3c9f5693753708ada5950c6d681200902c2372fcff7d3894855ba3d5f8  output/bitcoin-0.18.99-x86_64-linux-gnu.tar.gz
4fd545fcd5c321b7a93d8eac0d2b2a897d8fdd08f40ff62d4f4f9de9f9a57eb2  output/src/bitcoin-0.18.99.tar.gz

See commands in previous comment.

@hebasto
Copy link
Member

hebasto commented Aug 3, 2019

@dongcarl @practicalswift

A local build shows that I'm matching you... So perhaps either @fanquake or @hebasto can upload their tarballs?

bitcoin-0.18.99.tar.gz

Which way to upload up to 300 MB files is convenient?

@hebasto
Copy link
Member

hebasto commented Aug 3, 2019

Strange things happened. Just made another build:

$ guix --version
guix (GNU Guix) 82c77e52b8b46e0a3aad2cb12307c2e30547deec
Copyright (C) 2019 the Guix authors
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ guix describe
Generation 3	Jul 12 2019 19:20:36	(current)
  guix 82c77e5
    repository URL: https://github.com/dongcarl/guix.git
    branch: 2019-05-bitcoin-staging
    commit: 82c77e52b8b46e0a3aad2cb12307c2e30547deec
$ git rev-parse HEAD
751549b52a9a4cd27389d807ae67f02bbb39cd7f
$ find output/ -type f -print0 | sort -z | xargs -r0 sha256sum
6e26f21c48ea0acd564c5779be8ba7325f96616eaafa573c79669fc81033867b  output/bitcoin-0.18.99-aarch64-linux-gnu-debug.tar.gz
b3b7700eaca5eb032187e9fab6e057c9afb27a0f69ac22568fbf4c3c9885ad01  output/bitcoin-0.18.99-aarch64-linux-gnu.tar.gz
baa4f0461ed505e4993f832452659828a65a2da4247e40f3992e923c46798a29  output/bitcoin-0.18.99-arm-linux-gnueabihf-debug.tar.gz
40eaa54b14df6c00f7451cea9418b92f84555e3094057ee76a3aa4e505461aa0  output/bitcoin-0.18.99-arm-linux-gnueabihf.tar.gz
3407730d8ce02074c243c461a5edd86e651527a6d2b1f77f920e0c2030939d5f  output/bitcoin-0.18.99-i686-linux-gnu-debug.tar.gz
0ab534959d6e42ed86bc0700cd3a91838b28d7a0ab04c93a984096fba0e8595c  output/bitcoin-0.18.99-i686-linux-gnu.tar.gz
2a20b8e067d27e16e816f9c63f3f0a2ab6d31a8273bd28ec0aafe4080f9c0dd3  output/bitcoin-0.18.99-riscv64-linux-gnu-debug.tar.gz
9c0476e9d076dd05951940626a3bc2ddae8318649aade3b10c7772e74175bbcb  output/bitcoin-0.18.99-riscv64-linux-gnu.tar.gz
ef659978bfea35847b1c7501a5e45d26c7371349301e606a9242842593b4e5e4  output/bitcoin-0.18.99-x86_64-linux-gnu-debug.tar.gz
e3f11e3c9f5693753708ada5950c6d681200902c2372fcff7d3894855ba3d5f8  output/bitcoin-0.18.99-x86_64-linux-gnu.tar.gz
4fd545fcd5c321b7a93d8eac0d2b2a897d8fdd08f40ff62d4f4f9de9f9a57eb2  output/src/bitcoin-0.18.99.tar.gz

@practicalswift
Copy link
Contributor

@hebasto Thanks! Let me know if you see any non-matching hashes.

@fanquake What hashes are you getting?

@fanquake
Copy link
Member

fanquake commented Aug 4, 2019

Have just done another build from scratch. Seeing hashes that seem to match everyone else.

env PATH="/root/.config/guix/current/bin${PATH:+:}$PATH" guix describe
Generation 1	Aug 04 2019 01:17:09	(current)
  guix 82c77e5
    repository URL: https://github.com/dongcarl/guix.git
    branch: 2019-05-bitcoin-staging
    commit: 82c77e52b8b46e0a3aad2cb12307c2e30547deec
git rev-parse HEAD
751549b52a9a4cd27389d807ae67f02bbb39cd7f
find output/ -type f -print0 | sort -z | xargs -r0 sha256sum
6e26f21c48ea0acd564c5779be8ba7325f96616eaafa573c79669fc81033867b  output/bitcoin-0.18.99-aarch64-linux-gnu-debug.tar.gz
b3b7700eaca5eb032187e9fab6e057c9afb27a0f69ac22568fbf4c3c9885ad01  output/bitcoin-0.18.99-aarch64-linux-gnu.tar.gz
baa4f0461ed505e4993f832452659828a65a2da4247e40f3992e923c46798a29  output/bitcoin-0.18.99-arm-linux-gnueabihf-debug.tar.gz
40eaa54b14df6c00f7451cea9418b92f84555e3094057ee76a3aa4e505461aa0  output/bitcoin-0.18.99-arm-linux-gnueabihf.tar.gz
3407730d8ce02074c243c461a5edd86e651527a6d2b1f77f920e0c2030939d5f  output/bitcoin-0.18.99-i686-linux-gnu-debug.tar.gz
0ab534959d6e42ed86bc0700cd3a91838b28d7a0ab04c93a984096fba0e8595c  output/bitcoin-0.18.99-i686-linux-gnu.tar.gz
2a20b8e067d27e16e816f9c63f3f0a2ab6d31a8273bd28ec0aafe4080f9c0dd3  output/bitcoin-0.18.99-riscv64-linux-gnu-debug.tar.gz
9c0476e9d076dd05951940626a3bc2ddae8318649aade3b10c7772e74175bbcb  output/bitcoin-0.18.99-riscv64-linux-gnu.tar.gz
ef659978bfea35847b1c7501a5e45d26c7371349301e606a9242842593b4e5e4  output/bitcoin-0.18.99-x86_64-linux-gnu-debug.tar.gz
e3f11e3c9f5693753708ada5950c6d681200902c2372fcff7d3894855ba3d5f8  output/bitcoin-0.18.99-x86_64-linux-gnu.tar.gz
4fd545fcd5c321b7a93d8eac0d2b2a897d8fdd08f40ff62d4f4f9de9f9a57eb2  output/src/bitcoin-0.18.99.tar.gz

@practicalswift
Copy link
Contributor

@fanquake Thanks!

Good to hear that we're all getting the same hashes. I wonder what the root cause of the previously seen discrepancy was.

@hebasto
Copy link
Member

hebasto commented Aug 4, 2019

@practicalswift

I wonder what the root cause of the previously seen discrepancy was.

It seems that despite git rev-parse HEAD returned 751549b52a9a4cd27389d807ae67f02bbb39cd7f the actual build was on top of another commit. See my previous tarball #15277 (comment).

@dongcarl
Copy link
Contributor Author

dongcarl commented Aug 5, 2019

Very odd, I'm thinking it might just be a discrepancy arising from the Dockerfile COPY? Not too big a deal though, if we see this crop up again we'll be able to better document what happened exactly and how to avoid.

@practicalswift
Copy link
Contributor

practicalswift commented Aug 6, 2019

@dongcarl FWIW I've always built outside of Docker. @hebasto and @fanquake, did you build inside Docker when you got the unexpected hashes?

@hebasto
Copy link
Member

hebasto commented Aug 6, 2019

@dongcarl @practicalswift I do not use Docker.

monstrobishi pushed a commit to DeFiCh/ain that referenced this pull request Sep 6, 2020
751549b contrib: guix: Additional clarifications re: substitutes (Carl Dong)
cd3e947 contrib: guix: Various improvements. (Carl Dong)
8dff3e4 contrib: guix: Clarify SOURCE_DATE_EPOCH. (Carl Dong)
3e80ec3 contrib: Add deterministic Guix builds. (Carl Dong)

Pull request description:

  ~~**This post is kept updated as this project progresses. Use this [latest update link](bitcoin/bitcoin#15277 (comment)) to see what's new.**~~

  Please read the `README.md`.

  -----

  ### Guix Introduction

  This PR enables building bitcoin in Guix containers. [Guix](https://www.gnu.org/software/guix/manual/en/html_node/Features.html) is a transactional package manager much like Nix, but unlike Nix, it has more of a focus on [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) and [reproducibility](https://www.gnu.org/software/guix/blog/tags/reproducible-builds/) which are attractive for security-sensitive projects like bitcoin.

  ### Guix Build Walkthrough

  Please read the `README.md`.

  [Old instructions no. 4](bitcoin/bitcoin#15277 (comment))

  [Old instructions no. 3](bitcoin/bitcoin#15277 (comment))

  [Old instructions no. 2](bitcoin/bitcoin#15277 (comment))

  <details>
  <summary>Old instructions no. 1</summary>
  In this PR, we define a Guix [manifest](https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-package.html#profile_002dmanifest) in `contrib/guix/manifest.scm`, which declares what packages we want in our environment.

  We can then invoke
  ```
  guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```
  To have Guix:
  1. Build an environment containing the packages we defined in our `contrib/guix/manifest.scm` manifest from the Guix bootstrap binaries (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) for more details).
  2. Start a container with that environment that has no network access, and no access to the host's filesystem except to the `pwd` that it was started in.
  3. Drop you into a shell in that container.

  > Note: if you don't want to wait hours for Guix to build the entire world from scratch, you can eliminate the `--no-substitutes` option to have Guix download from available binary sources. Note that this convenience doesn't necessarily compromise your security, as you can check that a package was built correctly after the fact using `guix build --check <packagename>`

  Therefore, we can perform a build of bitcoin much like in Gitian by invoking the following:

  ```
  make -C depends -j"$(nproc)" download && \
      cat contrib/guix/build.sh | guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```

  We don't include `make -C depends -j"$(nproc)" download` inside `contrib/guix/build.sh` because `contrib/guix/build.sh` is run inside the container, which has no network access (which is a good thing).
  </details>

  ### Rationale

  I believe that this represents a substantial improvement for the "supply chain security" of bitcoin because:

  1. We no longer have to rely on Ubuntu for our build environment for our releases ([oh the horror](https://github.com/bitcoin/bitcoin/blob/72bd4ab867e3be0d8410403d9641c08288d343e3/contrib/gitian-descriptors/gitian-linux.yml#L10)), because Guix builds everything about the container, we can perform this on almost any Linux distro/system.
  2. It is now much easier to determine what trusted binaries are in our supply chain, and even make a nice visualization! (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html)).
  3. There is active effort among Guix folks to minimize the number of trusted binaries even further. OriansJ's [stage0](https://github.com/oriansj/stage0), and janneke's [Mes](https://www.gnu.org/software/mes/) all aim to achieve [reduced binary boostrap](http://joyofsource.com/reduced-binary-seed-bootstrap.html) for Guix. In fact, I believe if OriansJ gets his way, we will end up some day with only a single trusted binary: hex0 (a ~500 byte self-hosting hex assembler).

  ### Steps to Completion

  - [x] Successfully build bitcoin inside the Guix environment
  - [x] Make `check-symbols` pass
  - [x] Do the above but without nasty hacks
  - [x] Solve some of the more innocuous hacks
  - [ ] Make it cross-compile (HELP WANTED HERE)
    - [x] Linux
      - [x] x86_64-linux-gnu
      - [x] i686-linux-gnu
      - [x] aarch64-linux-gnu
      - [x] arm-linux-gnueabihf
      - [x] riscv64-linux-gnu
    - [ ] OS X
      - [ ] x86_64-apple-darwin14
    - [ ] Windows
      - [ ] x86_64-w64-mingw32
  - [ ] Maybe make importer for depends syntax
  - [ ] Document build process for future releases
  - [ ] Extra: Pin the revision of Guix that we build with with Guix [inferiors](https://www.gnu.org/software/guix/manual/en/html_node/Inferiors.html)

  ### Help Wanted

  [Old content no. 3](bitcoin/bitcoin#15277 (comment))

  [Old content no. 2](bitcoin/bitcoin#15277 (comment))

  <details>
  <summary>Old content no. 1</summary>
  As of now, the command described above to perform a build of bitcoin a lot like Gitian works, but fails at the `check-symbols` stage. This is because a few dynamic libraries are linked in that shouldn't be.

  Here's what `ldd src/bitcoind` looks like when built in a Guix container:
  ```
  	linux-vdso.so.1 (0x00007ffcc2d90000)
  	libdl.so.2 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libdl.so.2 (0x00007fb7eda09000)
  	librt.so.1 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/librt.so.1 (0x00007fb7ed9ff000)
  	libstdc++.so.6 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libstdc++.so.6 (0x00007fb7ed87c000)
  	libpthread.so.0 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libpthread.so.0 (0x00007fb7ed85b000)
  	libm.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libm.so.6 (0x00007fb7ed6da000)
  	libgcc_s.so.1 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libgcc_s.so.1 (0x00007fb7ed6bf000)
  	libc.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libc.so.6 (0x00007fb7ed506000)
  	/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fb7ee3a0000)
  ```

  And here's what it looks in one of our releases:
  ```
  	linux-vdso.so.1 (0x00007ffff52cd000)
  	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f87726b4000)
  	librt.so.1 => /usr/lib/librt.so.1 (0x00007f87726aa000)
  	libm.so.6 => /usr/lib/libm.so.6 (0x00007f8772525000)
  	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f877250b000)
  	libc.so.6 => /usr/lib/libc.so.6 (0x00007f8772347000)
  	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f8773392000)
  ```

  ~~I suspect it is because my script does not apply the gitian-input patches [described in the release process](https://github.com/bitcoin/bitcoin/blob/master/doc/release-process.md#fetch-and-create-inputs-first-time-or-when-dependency-versions-change) but there is no description as to how these patches are applied.~~ It might also be something else entirely.

  Edit: It is something else. It appears that the gitian inputs are only used by [`gitian-win-signer.yml`](https://github.com/bitcoin/bitcoin/blob/d6e700e40f861ddd6743f4d13f0d6f6bc19093c2/contrib/gitian-descriptors/gitian-win-signer.yml#L14)
  </details>

  ### How to Help

  1. Install Guix on your distro either [from source](https://www.gnu.org/software/guix/manual/en/html_node/Requirements.html) or perform a [binary installation](https://www.gnu.org/software/guix/manual/en/html_node/Binary-Installation.html#Binary-Installation)
  2. Try out my branch and the command described above!

ACKs for top commit:
  MarcoFalke:
    Thanks for the replies. ACK 751549b
  laanwj:
    ACK 751549b

Tree-SHA512: 50e6ab58c6bda9a67125b6271daf7eff0ca57d0efa8941ed3cd951e5bf78b31552fc5e537b1e1bcf2d3cc918c63adf19d685aa117a0f851024dc67e697890a8d
Munkybooty pushed a commit to Munkybooty/dash that referenced this pull request Nov 4, 2021
751549b contrib: guix: Additional clarifications re: substitutes (Carl Dong)
cd3e947 contrib: guix: Various improvements. (Carl Dong)
8dff3e4 contrib: guix: Clarify SOURCE_DATE_EPOCH. (Carl Dong)
3e80ec3 contrib: Add deterministic Guix builds. (Carl Dong)

Pull request description:

  ~~**This post is kept updated as this project progresses. Use this [latest update link](bitcoin#15277 (comment)) to see what's new.**~~

  Please read the `README.md`.

  -----

  ### Guix Introduction

  This PR enables building bitcoin in Guix containers. [Guix](https://www.gnu.org/software/guix/manual/en/html_node/Features.html) is a transactional package manager much like Nix, but unlike Nix, it has more of a focus on [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) and [reproducibility](https://www.gnu.org/software/guix/blog/tags/reproducible-builds/) which are attractive for security-sensitive projects like bitcoin.

  ### Guix Build Walkthrough

  Please read the `README.md`.

  [Old instructions no. 4](bitcoin#15277 (comment))

  [Old instructions no. 3](bitcoin#15277 (comment))

  [Old instructions no. 2](bitcoin#15277 (comment))

  <details>
  <summary>Old instructions no. 1</summary>
  In this PR, we define a Guix [manifest](https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-package.html#profile_002dmanifest) in `contrib/guix/manifest.scm`, which declares what packages we want in our environment.

  We can then invoke
  ```
  guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```
  To have Guix:
  1. Build an environment containing the packages we defined in our `contrib/guix/manifest.scm` manifest from the Guix bootstrap binaries (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) for more details).
  2. Start a container with that environment that has no network access, and no access to the host's filesystem except to the `pwd` that it was started in.
  3. Drop you into a shell in that container.

  > Note: if you don't want to wait hours for Guix to build the entire world from scratch, you can eliminate the `--no-substitutes` option to have Guix download from available binary sources. Note that this convenience doesn't necessarily compromise your security, as you can check that a package was built correctly after the fact using `guix build --check <packagename>`

  Therefore, we can perform a build of bitcoin much like in Gitian by invoking the following:

  ```
  make -C depends -j"$(nproc)" download && \
      cat contrib/guix/build.sh | guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```

  We don't include `make -C depends -j"$(nproc)" download` inside `contrib/guix/build.sh` because `contrib/guix/build.sh` is run inside the container, which has no network access (which is a good thing).
  </details>

  ### Rationale

  I believe that this represents a substantial improvement for the "supply chain security" of bitcoin because:

  1. We no longer have to rely on Ubuntu for our build environment for our releases ([oh the horror](https://github.com/bitcoin/bitcoin/blob/72bd4ab867e3be0d8410403d9641c08288d343e3/contrib/gitian-descriptors/gitian-linux.yml#L10)), because Guix builds everything about the container, we can perform this on almost any Linux distro/system.
  2. It is now much easier to determine what trusted binaries are in our supply chain, and even make a nice visualization! (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html)).
  3. There is active effort among Guix folks to minimize the number of trusted binaries even further. OriansJ's [stage0](https://github.com/oriansj/stage0), and janneke's [Mes](https://www.gnu.org/software/mes/) all aim to achieve [reduced binary boostrap](http://joyofsource.com/reduced-binary-seed-bootstrap.html) for Guix. In fact, I believe if OriansJ gets his way, we will end up some day with only a single trusted binary: hex0 (a ~500 byte self-hosting hex assembler).

  ### Steps to Completion

  - [x] Successfully build bitcoin inside the Guix environment
  - [x] Make `check-symbols` pass
  - [x] Do the above but without nasty hacks
  - [x] Solve some of the more innocuous hacks
  - [ ] Make it cross-compile (HELP WANTED HERE)
    - [x] Linux
      - [x] x86_64-linux-gnu
      - [x] i686-linux-gnu
      - [x] aarch64-linux-gnu
      - [x] arm-linux-gnueabihf
      - [x] riscv64-linux-gnu
    - [ ] OS X
      - [ ] x86_64-apple-darwin14
    - [ ] Windows
      - [ ] x86_64-w64-mingw32
  - [ ] Maybe make importer for depends syntax
  - [ ] Document build process for future releases
  - [ ] Extra: Pin the revision of Guix that we build with with Guix [inferiors](https://www.gnu.org/software/guix/manual/en/html_node/Inferiors.html)

  ### Help Wanted

  [Old content no. 3](bitcoin#15277 (comment))

  [Old content no. 2](bitcoin#15277 (comment))

  <details>
  <summary>Old content no. 1</summary>
  As of now, the command described above to perform a build of bitcoin a lot like Gitian works, but fails at the `check-symbols` stage. This is because a few dynamic libraries are linked in that shouldn't be.

  Here's what `ldd src/bitcoind` looks like when built in a Guix container:
  ```
  	linux-vdso.so.1 (0x00007ffcc2d90000)
  	libdl.so.2 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libdl.so.2 (0x00007fb7eda09000)
  	librt.so.1 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/librt.so.1 (0x00007fb7ed9ff000)
  	libstdc++.so.6 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libstdc++.so.6 (0x00007fb7ed87c000)
  	libpthread.so.0 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libpthread.so.0 (0x00007fb7ed85b000)
  	libm.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libm.so.6 (0x00007fb7ed6da000)
  	libgcc_s.so.1 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libgcc_s.so.1 (0x00007fb7ed6bf000)
  	libc.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libc.so.6 (0x00007fb7ed506000)
  	/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fb7ee3a0000)
  ```

  And here's what it looks in one of our releases:
  ```
  	linux-vdso.so.1 (0x00007ffff52cd000)
  	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f87726b4000)
  	librt.so.1 => /usr/lib/librt.so.1 (0x00007f87726aa000)
  	libm.so.6 => /usr/lib/libm.so.6 (0x00007f8772525000)
  	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f877250b000)
  	libc.so.6 => /usr/lib/libc.so.6 (0x00007f8772347000)
  	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f8773392000)
  ```

  ~~I suspect it is because my script does not apply the gitian-input patches [described in the release process](https://github.com/bitcoin/bitcoin/blob/master/doc/release-process.md#fetch-and-create-inputs-first-time-or-when-dependency-versions-change) but there is no description as to how these patches are applied.~~ It might also be something else entirely.

  Edit: It is something else. It appears that the gitian inputs are only used by [`gitian-win-signer.yml`](https://github.com/bitcoin/bitcoin/blob/d6e700e40f861ddd6743f4d13f0d6f6bc19093c2/contrib/gitian-descriptors/gitian-win-signer.yml#L14)
  </details>

  ### How to Help

  1. Install Guix on your distro either [from source](https://www.gnu.org/software/guix/manual/en/html_node/Requirements.html) or perform a [binary installation](https://www.gnu.org/software/guix/manual/en/html_node/Binary-Installation.html#Binary-Installation)
  2. Try out my branch and the command described above!

ACKs for top commit:
  MarcoFalke:
    Thanks for the replies. ACK 751549b
  laanwj:
    ACK 751549b

Tree-SHA512: 50e6ab58c6bda9a67125b6271daf7eff0ca57d0efa8941ed3cd951e5bf78b31552fc5e537b1e1bcf2d3cc918c63adf19d685aa117a0f851024dc67e697890a8d
Munkybooty pushed a commit to Munkybooty/dash that referenced this pull request Nov 6, 2021
751549b contrib: guix: Additional clarifications re: substitutes (Carl Dong)
cd3e947 contrib: guix: Various improvements. (Carl Dong)
8dff3e4 contrib: guix: Clarify SOURCE_DATE_EPOCH. (Carl Dong)
3e80ec3 contrib: Add deterministic Guix builds. (Carl Dong)

Pull request description:

  ~~**This post is kept updated as this project progresses. Use this [latest update link](bitcoin#15277 (comment)) to see what's new.**~~

  Please read the `README.md`.

  -----

  ### Guix Introduction

  This PR enables building bitcoin in Guix containers. [Guix](https://www.gnu.org/software/guix/manual/en/html_node/Features.html) is a transactional package manager much like Nix, but unlike Nix, it has more of a focus on [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) and [reproducibility](https://www.gnu.org/software/guix/blog/tags/reproducible-builds/) which are attractive for security-sensitive projects like bitcoin.

  ### Guix Build Walkthrough

  Please read the `README.md`.

  [Old instructions no. 4](bitcoin#15277 (comment))

  [Old instructions no. 3](bitcoin#15277 (comment))

  [Old instructions no. 2](bitcoin#15277 (comment))

  <details>
  <summary>Old instructions no. 1</summary>
  In this PR, we define a Guix [manifest](https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-package.html#profile_002dmanifest) in `contrib/guix/manifest.scm`, which declares what packages we want in our environment.

  We can then invoke
  ```
  guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```
  To have Guix:
  1. Build an environment containing the packages we defined in our `contrib/guix/manifest.scm` manifest from the Guix bootstrap binaries (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) for more details).
  2. Start a container with that environment that has no network access, and no access to the host's filesystem except to the `pwd` that it was started in.
  3. Drop you into a shell in that container.

  > Note: if you don't want to wait hours for Guix to build the entire world from scratch, you can eliminate the `--no-substitutes` option to have Guix download from available binary sources. Note that this convenience doesn't necessarily compromise your security, as you can check that a package was built correctly after the fact using `guix build --check <packagename>`

  Therefore, we can perform a build of bitcoin much like in Gitian by invoking the following:

  ```
  make -C depends -j"$(nproc)" download && \
      cat contrib/guix/build.sh | guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```

  We don't include `make -C depends -j"$(nproc)" download` inside `contrib/guix/build.sh` because `contrib/guix/build.sh` is run inside the container, which has no network access (which is a good thing).
  </details>

  ### Rationale

  I believe that this represents a substantial improvement for the "supply chain security" of bitcoin because:

  1. We no longer have to rely on Ubuntu for our build environment for our releases ([oh the horror](https://github.com/bitcoin/bitcoin/blob/72bd4ab867e3be0d8410403d9641c08288d343e3/contrib/gitian-descriptors/gitian-linux.yml#L10)), because Guix builds everything about the container, we can perform this on almost any Linux distro/system.
  2. It is now much easier to determine what trusted binaries are in our supply chain, and even make a nice visualization! (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html)).
  3. There is active effort among Guix folks to minimize the number of trusted binaries even further. OriansJ's [stage0](https://github.com/oriansj/stage0), and janneke's [Mes](https://www.gnu.org/software/mes/) all aim to achieve [reduced binary boostrap](http://joyofsource.com/reduced-binary-seed-bootstrap.html) for Guix. In fact, I believe if OriansJ gets his way, we will end up some day with only a single trusted binary: hex0 (a ~500 byte self-hosting hex assembler).

  ### Steps to Completion

  - [x] Successfully build bitcoin inside the Guix environment
  - [x] Make `check-symbols` pass
  - [x] Do the above but without nasty hacks
  - [x] Solve some of the more innocuous hacks
  - [ ] Make it cross-compile (HELP WANTED HERE)
    - [x] Linux
      - [x] x86_64-linux-gnu
      - [x] i686-linux-gnu
      - [x] aarch64-linux-gnu
      - [x] arm-linux-gnueabihf
      - [x] riscv64-linux-gnu
    - [ ] OS X
      - [ ] x86_64-apple-darwin14
    - [ ] Windows
      - [ ] x86_64-w64-mingw32
  - [ ] Maybe make importer for depends syntax
  - [ ] Document build process for future releases
  - [ ] Extra: Pin the revision of Guix that we build with with Guix [inferiors](https://www.gnu.org/software/guix/manual/en/html_node/Inferiors.html)

  ### Help Wanted

  [Old content no. 3](bitcoin#15277 (comment))

  [Old content no. 2](bitcoin#15277 (comment))

  <details>
  <summary>Old content no. 1</summary>
  As of now, the command described above to perform a build of bitcoin a lot like Gitian works, but fails at the `check-symbols` stage. This is because a few dynamic libraries are linked in that shouldn't be.

  Here's what `ldd src/bitcoind` looks like when built in a Guix container:
  ```
  	linux-vdso.so.1 (0x00007ffcc2d90000)
  	libdl.so.2 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libdl.so.2 (0x00007fb7eda09000)
  	librt.so.1 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/librt.so.1 (0x00007fb7ed9ff000)
  	libstdc++.so.6 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libstdc++.so.6 (0x00007fb7ed87c000)
  	libpthread.so.0 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libpthread.so.0 (0x00007fb7ed85b000)
  	libm.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libm.so.6 (0x00007fb7ed6da000)
  	libgcc_s.so.1 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libgcc_s.so.1 (0x00007fb7ed6bf000)
  	libc.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libc.so.6 (0x00007fb7ed506000)
  	/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fb7ee3a0000)
  ```

  And here's what it looks in one of our releases:
  ```
  	linux-vdso.so.1 (0x00007ffff52cd000)
  	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f87726b4000)
  	librt.so.1 => /usr/lib/librt.so.1 (0x00007f87726aa000)
  	libm.so.6 => /usr/lib/libm.so.6 (0x00007f8772525000)
  	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f877250b000)
  	libc.so.6 => /usr/lib/libc.so.6 (0x00007f8772347000)
  	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f8773392000)
  ```

  ~~I suspect it is because my script does not apply the gitian-input patches [described in the release process](https://github.com/bitcoin/bitcoin/blob/master/doc/release-process.md#fetch-and-create-inputs-first-time-or-when-dependency-versions-change) but there is no description as to how these patches are applied.~~ It might also be something else entirely.

  Edit: It is something else. It appears that the gitian inputs are only used by [`gitian-win-signer.yml`](https://github.com/bitcoin/bitcoin/blob/d6e700e40f861ddd6743f4d13f0d6f6bc19093c2/contrib/gitian-descriptors/gitian-win-signer.yml#L14)
  </details>

  ### How to Help

  1. Install Guix on your distro either [from source](https://www.gnu.org/software/guix/manual/en/html_node/Requirements.html) or perform a [binary installation](https://www.gnu.org/software/guix/manual/en/html_node/Binary-Installation.html#Binary-Installation)
  2. Try out my branch and the command described above!

ACKs for top commit:
  MarcoFalke:
    Thanks for the replies. ACK 751549b
  laanwj:
    ACK 751549b

Tree-SHA512: 50e6ab58c6bda9a67125b6271daf7eff0ca57d0efa8941ed3cd951e5bf78b31552fc5e537b1e1bcf2d3cc918c63adf19d685aa117a0f851024dc67e697890a8d
Munkybooty pushed a commit to Munkybooty/dash that referenced this pull request Nov 12, 2021
751549b contrib: guix: Additional clarifications re: substitutes (Carl Dong)
cd3e947 contrib: guix: Various improvements. (Carl Dong)
8dff3e4 contrib: guix: Clarify SOURCE_DATE_EPOCH. (Carl Dong)
3e80ec3 contrib: Add deterministic Guix builds. (Carl Dong)

Pull request description:

  ~~**This post is kept updated as this project progresses. Use this [latest update link](bitcoin#15277 (comment)) to see what's new.**~~

  Please read the `README.md`.

  -----

  ### Guix Introduction

  This PR enables building bitcoin in Guix containers. [Guix](https://www.gnu.org/software/guix/manual/en/html_node/Features.html) is a transactional package manager much like Nix, but unlike Nix, it has more of a focus on [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) and [reproducibility](https://www.gnu.org/software/guix/blog/tags/reproducible-builds/) which are attractive for security-sensitive projects like bitcoin.

  ### Guix Build Walkthrough

  Please read the `README.md`.

  [Old instructions no. 4](bitcoin#15277 (comment))

  [Old instructions no. 3](bitcoin#15277 (comment))

  [Old instructions no. 2](bitcoin#15277 (comment))

  <details>
  <summary>Old instructions no. 1</summary>
  In this PR, we define a Guix [manifest](https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-package.html#profile_002dmanifest) in `contrib/guix/manifest.scm`, which declares what packages we want in our environment.

  We can then invoke
  ```
  guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```
  To have Guix:
  1. Build an environment containing the packages we defined in our `contrib/guix/manifest.scm` manifest from the Guix bootstrap binaries (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) for more details).
  2. Start a container with that environment that has no network access, and no access to the host's filesystem except to the `pwd` that it was started in.
  3. Drop you into a shell in that container.

  > Note: if you don't want to wait hours for Guix to build the entire world from scratch, you can eliminate the `--no-substitutes` option to have Guix download from available binary sources. Note that this convenience doesn't necessarily compromise your security, as you can check that a package was built correctly after the fact using `guix build --check <packagename>`

  Therefore, we can perform a build of bitcoin much like in Gitian by invoking the following:

  ```
  make -C depends -j"$(nproc)" download && \
      cat contrib/guix/build.sh | guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```

  We don't include `make -C depends -j"$(nproc)" download` inside `contrib/guix/build.sh` because `contrib/guix/build.sh` is run inside the container, which has no network access (which is a good thing).
  </details>

  ### Rationale

  I believe that this represents a substantial improvement for the "supply chain security" of bitcoin because:

  1. We no longer have to rely on Ubuntu for our build environment for our releases ([oh the horror](https://github.com/bitcoin/bitcoin/blob/72bd4ab867e3be0d8410403d9641c08288d343e3/contrib/gitian-descriptors/gitian-linux.yml#L10)), because Guix builds everything about the container, we can perform this on almost any Linux distro/system.
  2. It is now much easier to determine what trusted binaries are in our supply chain, and even make a nice visualization! (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html)).
  3. There is active effort among Guix folks to minimize the number of trusted binaries even further. OriansJ's [stage0](https://github.com/oriansj/stage0), and janneke's [Mes](https://www.gnu.org/software/mes/) all aim to achieve [reduced binary boostrap](http://joyofsource.com/reduced-binary-seed-bootstrap.html) for Guix. In fact, I believe if OriansJ gets his way, we will end up some day with only a single trusted binary: hex0 (a ~500 byte self-hosting hex assembler).

  ### Steps to Completion

  - [x] Successfully build bitcoin inside the Guix environment
  - [x] Make `check-symbols` pass
  - [x] Do the above but without nasty hacks
  - [x] Solve some of the more innocuous hacks
  - [ ] Make it cross-compile (HELP WANTED HERE)
    - [x] Linux
      - [x] x86_64-linux-gnu
      - [x] i686-linux-gnu
      - [x] aarch64-linux-gnu
      - [x] arm-linux-gnueabihf
      - [x] riscv64-linux-gnu
    - [ ] OS X
      - [ ] x86_64-apple-darwin14
    - [ ] Windows
      - [ ] x86_64-w64-mingw32
  - [ ] Maybe make importer for depends syntax
  - [ ] Document build process for future releases
  - [ ] Extra: Pin the revision of Guix that we build with with Guix [inferiors](https://www.gnu.org/software/guix/manual/en/html_node/Inferiors.html)

  ### Help Wanted

  [Old content no. 3](bitcoin#15277 (comment))

  [Old content no. 2](bitcoin#15277 (comment))

  <details>
  <summary>Old content no. 1</summary>
  As of now, the command described above to perform a build of bitcoin a lot like Gitian works, but fails at the `check-symbols` stage. This is because a few dynamic libraries are linked in that shouldn't be.

  Here's what `ldd src/bitcoind` looks like when built in a Guix container:
  ```
  	linux-vdso.so.1 (0x00007ffcc2d90000)
  	libdl.so.2 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libdl.so.2 (0x00007fb7eda09000)
  	librt.so.1 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/librt.so.1 (0x00007fb7ed9ff000)
  	libstdc++.so.6 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libstdc++.so.6 (0x00007fb7ed87c000)
  	libpthread.so.0 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libpthread.so.0 (0x00007fb7ed85b000)
  	libm.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libm.so.6 (0x00007fb7ed6da000)
  	libgcc_s.so.1 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libgcc_s.so.1 (0x00007fb7ed6bf000)
  	libc.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libc.so.6 (0x00007fb7ed506000)
  	/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fb7ee3a0000)
  ```

  And here's what it looks in one of our releases:
  ```
  	linux-vdso.so.1 (0x00007ffff52cd000)
  	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f87726b4000)
  	librt.so.1 => /usr/lib/librt.so.1 (0x00007f87726aa000)
  	libm.so.6 => /usr/lib/libm.so.6 (0x00007f8772525000)
  	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f877250b000)
  	libc.so.6 => /usr/lib/libc.so.6 (0x00007f8772347000)
  	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f8773392000)
  ```

  ~~I suspect it is because my script does not apply the gitian-input patches [described in the release process](https://github.com/bitcoin/bitcoin/blob/master/doc/release-process.md#fetch-and-create-inputs-first-time-or-when-dependency-versions-change) but there is no description as to how these patches are applied.~~ It might also be something else entirely.

  Edit: It is something else. It appears that the gitian inputs are only used by [`gitian-win-signer.yml`](https://github.com/bitcoin/bitcoin/blob/d6e700e40f861ddd6743f4d13f0d6f6bc19093c2/contrib/gitian-descriptors/gitian-win-signer.yml#L14)
  </details>

  ### How to Help

  1. Install Guix on your distro either [from source](https://www.gnu.org/software/guix/manual/en/html_node/Requirements.html) or perform a [binary installation](https://www.gnu.org/software/guix/manual/en/html_node/Binary-Installation.html#Binary-Installation)
  2. Try out my branch and the command described above!

ACKs for top commit:
  MarcoFalke:
    Thanks for the replies. ACK 751549b
  laanwj:
    ACK 751549b

Tree-SHA512: 50e6ab58c6bda9a67125b6271daf7eff0ca57d0efa8941ed3cd951e5bf78b31552fc5e537b1e1bcf2d3cc918c63adf19d685aa117a0f851024dc67e697890a8d
Munkybooty pushed a commit to Munkybooty/dash that referenced this pull request Nov 16, 2021
751549b contrib: guix: Additional clarifications re: substitutes (Carl Dong)
cd3e947 contrib: guix: Various improvements. (Carl Dong)
8dff3e4 contrib: guix: Clarify SOURCE_DATE_EPOCH. (Carl Dong)
3e80ec3 contrib: Add deterministic Guix builds. (Carl Dong)

Pull request description:

  ~~**This post is kept updated as this project progresses. Use this [latest update link](bitcoin#15277 (comment)) to see what's new.**~~

  Please read the `README.md`.

  -----

  ### Guix Introduction

  This PR enables building bitcoin in Guix containers. [Guix](https://www.gnu.org/software/guix/manual/en/html_node/Features.html) is a transactional package manager much like Nix, but unlike Nix, it has more of a focus on [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) and [reproducibility](https://www.gnu.org/software/guix/blog/tags/reproducible-builds/) which are attractive for security-sensitive projects like bitcoin.

  ### Guix Build Walkthrough

  Please read the `README.md`.

  [Old instructions no. 4](bitcoin#15277 (comment))

  [Old instructions no. 3](bitcoin#15277 (comment))

  [Old instructions no. 2](bitcoin#15277 (comment))

  <details>
  <summary>Old instructions no. 1</summary>
  In this PR, we define a Guix [manifest](https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-package.html#profile_002dmanifest) in `contrib/guix/manifest.scm`, which declares what packages we want in our environment.

  We can then invoke
  ```
  guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```
  To have Guix:
  1. Build an environment containing the packages we defined in our `contrib/guix/manifest.scm` manifest from the Guix bootstrap binaries (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) for more details).
  2. Start a container with that environment that has no network access, and no access to the host's filesystem except to the `pwd` that it was started in.
  3. Drop you into a shell in that container.

  > Note: if you don't want to wait hours for Guix to build the entire world from scratch, you can eliminate the `--no-substitutes` option to have Guix download from available binary sources. Note that this convenience doesn't necessarily compromise your security, as you can check that a package was built correctly after the fact using `guix build --check <packagename>`

  Therefore, we can perform a build of bitcoin much like in Gitian by invoking the following:

  ```
  make -C depends -j"$(nproc)" download && \
      cat contrib/guix/build.sh | guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```

  We don't include `make -C depends -j"$(nproc)" download` inside `contrib/guix/build.sh` because `contrib/guix/build.sh` is run inside the container, which has no network access (which is a good thing).
  </details>

  ### Rationale

  I believe that this represents a substantial improvement for the "supply chain security" of bitcoin because:

  1. We no longer have to rely on Ubuntu for our build environment for our releases ([oh the horror](https://github.com/bitcoin/bitcoin/blob/72bd4ab867e3be0d8410403d9641c08288d343e3/contrib/gitian-descriptors/gitian-linux.yml#L10)), because Guix builds everything about the container, we can perform this on almost any Linux distro/system.
  2. It is now much easier to determine what trusted binaries are in our supply chain, and even make a nice visualization! (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html)).
  3. There is active effort among Guix folks to minimize the number of trusted binaries even further. OriansJ's [stage0](https://github.com/oriansj/stage0), and janneke's [Mes](https://www.gnu.org/software/mes/) all aim to achieve [reduced binary boostrap](http://joyofsource.com/reduced-binary-seed-bootstrap.html) for Guix. In fact, I believe if OriansJ gets his way, we will end up some day with only a single trusted binary: hex0 (a ~500 byte self-hosting hex assembler).

  ### Steps to Completion

  - [x] Successfully build bitcoin inside the Guix environment
  - [x] Make `check-symbols` pass
  - [x] Do the above but without nasty hacks
  - [x] Solve some of the more innocuous hacks
  - [ ] Make it cross-compile (HELP WANTED HERE)
    - [x] Linux
      - [x] x86_64-linux-gnu
      - [x] i686-linux-gnu
      - [x] aarch64-linux-gnu
      - [x] arm-linux-gnueabihf
      - [x] riscv64-linux-gnu
    - [ ] OS X
      - [ ] x86_64-apple-darwin14
    - [ ] Windows
      - [ ] x86_64-w64-mingw32
  - [ ] Maybe make importer for depends syntax
  - [ ] Document build process for future releases
  - [ ] Extra: Pin the revision of Guix that we build with with Guix [inferiors](https://www.gnu.org/software/guix/manual/en/html_node/Inferiors.html)

  ### Help Wanted

  [Old content no. 3](bitcoin#15277 (comment))

  [Old content no. 2](bitcoin#15277 (comment))

  <details>
  <summary>Old content no. 1</summary>
  As of now, the command described above to perform a build of bitcoin a lot like Gitian works, but fails at the `check-symbols` stage. This is because a few dynamic libraries are linked in that shouldn't be.

  Here's what `ldd src/bitcoind` looks like when built in a Guix container:
  ```
  	linux-vdso.so.1 (0x00007ffcc2d90000)
  	libdl.so.2 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libdl.so.2 (0x00007fb7eda09000)
  	librt.so.1 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/librt.so.1 (0x00007fb7ed9ff000)
  	libstdc++.so.6 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libstdc++.so.6 (0x00007fb7ed87c000)
  	libpthread.so.0 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libpthread.so.0 (0x00007fb7ed85b000)
  	libm.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libm.so.6 (0x00007fb7ed6da000)
  	libgcc_s.so.1 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libgcc_s.so.1 (0x00007fb7ed6bf000)
  	libc.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libc.so.6 (0x00007fb7ed506000)
  	/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fb7ee3a0000)
  ```

  And here's what it looks in one of our releases:
  ```
  	linux-vdso.so.1 (0x00007ffff52cd000)
  	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f87726b4000)
  	librt.so.1 => /usr/lib/librt.so.1 (0x00007f87726aa000)
  	libm.so.6 => /usr/lib/libm.so.6 (0x00007f8772525000)
  	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f877250b000)
  	libc.so.6 => /usr/lib/libc.so.6 (0x00007f8772347000)
  	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f8773392000)
  ```

  ~~I suspect it is because my script does not apply the gitian-input patches [described in the release process](https://github.com/bitcoin/bitcoin/blob/master/doc/release-process.md#fetch-and-create-inputs-first-time-or-when-dependency-versions-change) but there is no description as to how these patches are applied.~~ It might also be something else entirely.

  Edit: It is something else. It appears that the gitian inputs are only used by [`gitian-win-signer.yml`](https://github.com/bitcoin/bitcoin/blob/d6e700e40f861ddd6743f4d13f0d6f6bc19093c2/contrib/gitian-descriptors/gitian-win-signer.yml#L14)
  </details>

  ### How to Help

  1. Install Guix on your distro either [from source](https://www.gnu.org/software/guix/manual/en/html_node/Requirements.html) or perform a [binary installation](https://www.gnu.org/software/guix/manual/en/html_node/Binary-Installation.html#Binary-Installation)
  2. Try out my branch and the command described above!

ACKs for top commit:
  MarcoFalke:
    Thanks for the replies. ACK 751549b
  laanwj:
    ACK 751549b

Tree-SHA512: 50e6ab58c6bda9a67125b6271daf7eff0ca57d0efa8941ed3cd951e5bf78b31552fc5e537b1e1bcf2d3cc918c63adf19d685aa117a0f851024dc67e697890a8d
Munkybooty pushed a commit to Munkybooty/dash that referenced this pull request Nov 18, 2021
751549b contrib: guix: Additional clarifications re: substitutes (Carl Dong)
cd3e947 contrib: guix: Various improvements. (Carl Dong)
8dff3e4 contrib: guix: Clarify SOURCE_DATE_EPOCH. (Carl Dong)
3e80ec3 contrib: Add deterministic Guix builds. (Carl Dong)

Pull request description:

  ~~**This post is kept updated as this project progresses. Use this [latest update link](bitcoin#15277 (comment)) to see what's new.**~~

  Please read the `README.md`.

  -----

  ### Guix Introduction

  This PR enables building bitcoin in Guix containers. [Guix](https://www.gnu.org/software/guix/manual/en/html_node/Features.html) is a transactional package manager much like Nix, but unlike Nix, it has more of a focus on [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) and [reproducibility](https://www.gnu.org/software/guix/blog/tags/reproducible-builds/) which are attractive for security-sensitive projects like bitcoin.

  ### Guix Build Walkthrough

  Please read the `README.md`.

  [Old instructions no. 4](bitcoin#15277 (comment))

  [Old instructions no. 3](bitcoin#15277 (comment))

  [Old instructions no. 2](bitcoin#15277 (comment))

  <details>
  <summary>Old instructions no. 1</summary>
  In this PR, we define a Guix [manifest](https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-package.html#profile_002dmanifest) in `contrib/guix/manifest.scm`, which declares what packages we want in our environment.

  We can then invoke
  ```
  guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```
  To have Guix:
  1. Build an environment containing the packages we defined in our `contrib/guix/manifest.scm` manifest from the Guix bootstrap binaries (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html) for more details).
  2. Start a container with that environment that has no network access, and no access to the host's filesystem except to the `pwd` that it was started in.
  3. Drop you into a shell in that container.

  > Note: if you don't want to wait hours for Guix to build the entire world from scratch, you can eliminate the `--no-substitutes` option to have Guix download from available binary sources. Note that this convenience doesn't necessarily compromise your security, as you can check that a package was built correctly after the fact using `guix build --check <packagename>`

  Therefore, we can perform a build of bitcoin much like in Gitian by invoking the following:

  ```
  make -C depends -j"$(nproc)" download && \
      cat contrib/guix/build.sh | guix environment --manifest=contrib/guix/manifest.scm --container --pure --no-grafts --no-substitutes
  ```

  We don't include `make -C depends -j"$(nproc)" download` inside `contrib/guix/build.sh` because `contrib/guix/build.sh` is run inside the container, which has no network access (which is a good thing).
  </details>

  ### Rationale

  I believe that this represents a substantial improvement for the "supply chain security" of bitcoin because:

  1. We no longer have to rely on Ubuntu for our build environment for our releases ([oh the horror](https://github.com/bitcoin/bitcoin/blob/72bd4ab867e3be0d8410403d9641c08288d343e3/contrib/gitian-descriptors/gitian-linux.yml#L10)), because Guix builds everything about the container, we can perform this on almost any Linux distro/system.
  2. It is now much easier to determine what trusted binaries are in our supply chain, and even make a nice visualization! (see [bootstrappability](https://www.gnu.org/software/guix/manual/en/html_node/Bootstrapping.html)).
  3. There is active effort among Guix folks to minimize the number of trusted binaries even further. OriansJ's [stage0](https://github.com/oriansj/stage0), and janneke's [Mes](https://www.gnu.org/software/mes/) all aim to achieve [reduced binary boostrap](http://joyofsource.com/reduced-binary-seed-bootstrap.html) for Guix. In fact, I believe if OriansJ gets his way, we will end up some day with only a single trusted binary: hex0 (a ~500 byte self-hosting hex assembler).

  ### Steps to Completion

  - [x] Successfully build bitcoin inside the Guix environment
  - [x] Make `check-symbols` pass
  - [x] Do the above but without nasty hacks
  - [x] Solve some of the more innocuous hacks
  - [ ] Make it cross-compile (HELP WANTED HERE)
    - [x] Linux
      - [x] x86_64-linux-gnu
      - [x] i686-linux-gnu
      - [x] aarch64-linux-gnu
      - [x] arm-linux-gnueabihf
      - [x] riscv64-linux-gnu
    - [ ] OS X
      - [ ] x86_64-apple-darwin14
    - [ ] Windows
      - [ ] x86_64-w64-mingw32
  - [ ] Maybe make importer for depends syntax
  - [ ] Document build process for future releases
  - [ ] Extra: Pin the revision of Guix that we build with with Guix [inferiors](https://www.gnu.org/software/guix/manual/en/html_node/Inferiors.html)

  ### Help Wanted

  [Old content no. 3](bitcoin#15277 (comment))

  [Old content no. 2](bitcoin#15277 (comment))

  <details>
  <summary>Old content no. 1</summary>
  As of now, the command described above to perform a build of bitcoin a lot like Gitian works, but fails at the `check-symbols` stage. This is because a few dynamic libraries are linked in that shouldn't be.

  Here's what `ldd src/bitcoind` looks like when built in a Guix container:
  ```
  	linux-vdso.so.1 (0x00007ffcc2d90000)
  	libdl.so.2 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libdl.so.2 (0x00007fb7eda09000)
  	librt.so.1 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/librt.so.1 (0x00007fb7ed9ff000)
  	libstdc++.so.6 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libstdc++.so.6 (0x00007fb7ed87c000)
  	libpthread.so.0 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libpthread.so.0 (0x00007fb7ed85b000)
  	libm.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libm.so.6 (0x00007fb7ed6da000)
  	libgcc_s.so.1 => /gnu/store/4sqps8dczv3g7rwbdibfz6rf5jlk7w90-gcc-5.5.0-lib/lib/libgcc_s.so.1 (0x00007fb7ed6bf000)
  	libc.so.6 => /gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/libc.so.6 (0x00007fb7ed506000)
  	/gnu/store/h90vnqw0nwd0hhm1l5dgxsdrigddfmq4-glibc-2.28/lib/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fb7ee3a0000)
  ```

  And here's what it looks in one of our releases:
  ```
  	linux-vdso.so.1 (0x00007ffff52cd000)
  	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f87726b4000)
  	librt.so.1 => /usr/lib/librt.so.1 (0x00007f87726aa000)
  	libm.so.6 => /usr/lib/libm.so.6 (0x00007f8772525000)
  	libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f877250b000)
  	libc.so.6 => /usr/lib/libc.so.6 (0x00007f8772347000)
  	/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f8773392000)
  ```

  ~~I suspect it is because my script does not apply the gitian-input patches [described in the release process](https://github.com/bitcoin/bitcoin/blob/master/doc/release-process.md#fetch-and-create-inputs-first-time-or-when-dependency-versions-change) but there is no description as to how these patches are applied.~~ It might also be something else entirely.

  Edit: It is something else. It appears that the gitian inputs are only used by [`gitian-win-signer.yml`](https://github.com/bitcoin/bitcoin/blob/d6e700e40f861ddd6743f4d13f0d6f6bc19093c2/contrib/gitian-descriptors/gitian-win-signer.yml#L14)
  </details>

  ### How to Help

  1. Install Guix on your distro either [from source](https://www.gnu.org/software/guix/manual/en/html_node/Requirements.html) or perform a [binary installation](https://www.gnu.org/software/guix/manual/en/html_node/Binary-Installation.html#Binary-Installation)
  2. Try out my branch and the command described above!

ACKs for top commit:
  MarcoFalke:
    Thanks for the replies. ACK 751549b
  laanwj:
    ACK 751549b

Tree-SHA512: 50e6ab58c6bda9a67125b6271daf7eff0ca57d0efa8941ed3cd951e5bf78b31552fc5e537b1e1bcf2d3cc918c63adf19d685aa117a0f851024dc67e697890a8d
@bitcoin bitcoin locked as resolved and limited conversation to collaborators Dec 16, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet