All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Le Bihan <eric.le.bihan.dev@free.fr>
To: buildroot@busybox.net
Subject: [Buildroot] Building cargo with per-package directories
Date: Wed, 12 Dec 2018 23:50:41 +0100	[thread overview]
Message-ID: <20181212225041.GA15035@itchy> (raw)
In-Reply-To: <20181211212705.GA13119@itchy>

On 2018-12-11 22:27, Eric Le Bihan wrote:
> Hi!
> On 2018-12-11 17:12, Thomas Petazzoni wrote:
> > Hello ?ric,
> >
> > As you probably know, I'm working on support for per-package
> > directories, which will allow to do top-level parallel in a reliable
> > way. As part of this effort, I've started an autobuilder that uses
> > per-package directories, and one of the package that is failing a lot
> > is host-cargo.
> >
> > It fails like this:
> >
> >   = note: /usr/bin/ld: cannot find -lhttp_parser
> >           collect2: error: ld returned 1 exit status
> >
> > error: aborting due to previous error
> > error: Could not compile `cargo`.
> >
> > The problem is that while libhttp_parser gets built properly, cargo is
> > not passing the appropriate -L flag to cargo's per-package host/lib
> > directory. So the linker doesn't find the libhttp_parser library, and
> > bails out.
> >
> > I've tried to look into this, but really the cargo build system is very
> > unique and weird, and I'm having a hard time finding my way. Do you
> > think you could help me a bit on this topic ?
>
> Of course!
>
> >
> > To reproduce, you need a machine where libhttp_parser is not installed
> > system-wide (so either remove it from your system, or build in a
> > chroot/docker/VM). Then, take this branch:
> >
> >   https://git.bootlin.com/users/thomas-petazzoni/buildroot/log/?h=ppsh-v7-work
> >
> > And build the following defconfig:
> >
> > BR2_arm=y
> > BR2_cortex_a9=y
> > BR2_ARM_ENABLE_VFP=y
> > BR2_PER_PACKAGE_DIRECTORIES=y
> > BR2_TOOLCHAIN_EXTERNAL=y
> > BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
> > BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
> > BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-a9-glibc-2018.05.tar.bz2"
> > BR2_TOOLCHAIN_EXTERNAL_GCC_7=y
> > BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_16=y
> > BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC=y
> > BR2_TOOLCHAIN_EXTERNAL_CXX=y
> > BR2_INIT_NONE=y
> > BR2_SYSTEM_BIN_SH_NONE=y
> > # BR2_PACKAGE_BUSYBOX is not set
> > # BR2_TARGET_ROOTFS_TAR is not set
> > BR2_PACKAGE_HOST_CARGO=y
> >
> > You should get this failure:
> >
> >   http://code.bulix.org/fxjgrv-520980?raw
> >
> > Thanks in advance for your support,
>
> I added your clone as remote, checked out ppsh-v7-work branch and
> launched a Debian Stretch chroot. I'll keep you posted on the result.

The build ended as expected.

```
  = note: /usr/bin/ld: cannot find -lhttp_parser
          collect2: error: ld returned 1 exit status
```

The library libhttp_parser.so is required by one of the dependencies of
cargo: libgit2-sys, which provides the Rust interface to libgit2.

There is trick in vendor/libgit2-sys/build.rs to handle
libhttp_parser.so: if the pkgconfig file of libgit2 contains -lhttp_parser,
then pass it to rustc via "cargo:rustc-link-lib=http_parser".

See "Outputs of the Build Script" in Cargo Book [1] for details.

We want to use per-package/host-cargo/host/lib/libhttp_parser.so. Adding
"-Clink-arg=-L$(HOST_DIR)/lib" to the RUSTFLAGS environment variable
solves the issue on my system:

```
diff --git a/package/cargo/cargo.mk b/package/cargo/cargo.mk
index 1b1053ba41..891901578e 100644
--- a/package/cargo/cargo.mk
+++ b/package/cargo/cargo.mk
@@ -70,7 +70,7 @@ HOST_CARGO_SNAP_OPTS = \
 	$(if $(VERBOSE),--verbose)

 HOST_CARGO_ENV = \
-	RUSTFLAGS="-Clink-arg=-Wl,-rpath,$(HOST_DIR)/lib" \
+	RUSTFLAGS="-Clink-arg=-Wl,-rpath,$(HOST_DIR)/lib -Clink-arg=-L$(HOST_DIR)/lib" \
 	CARGO_HOME=$(HOST_CARGO_HOME)

 define HOST_CARGO_BUILD_CMDS
```

[1] https://doc.rust-lang.org/cargo/reference/build-scripts.html#outputs-of-the-build-script

Regards,

--
ELB

  reply	other threads:[~2018-12-12 22:50 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-11 16:12 [Buildroot] Building cargo with per-package directories Thomas Petazzoni
2018-12-11 21:27 ` Eric Le Bihan
2018-12-12 22:50   ` Eric Le Bihan [this message]
2018-12-13 20:04     ` Thomas Petazzoni
2018-12-26 14:49     ` Thomas Petazzoni
2018-12-27 20:50       ` Eric Le Bihan
2018-12-28  9:21         ` Thomas Petazzoni
2018-12-28 11:49           ` Eric Le Bihan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181212225041.GA15035@itchy \
    --to=eric.le.bihan.dev@free.fr \
    --cc=buildroot@busybox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.