Skip to contentSkip to conversation

Add support for the Rust programming language

PATCH Superseded Eric Le Bihan 4 participants 21 messages Apr 2, 2017 – Apr 13, 2017

v4 of 10 Superseded Latest is v10 →

lore
Share & tools
lore
#0 lore raw

v4 cover Add support for the Rust programming language

This series adds support for the Rust programming language by providing a package for the host variant of the Rust compiler, able to cross-compile code for ARM, MIPS, PowerPC and x86_64 architectures.

As the Rust compiler is written in Rust and uses Cargo, the Rust package manager, as build system, two additional packages are provided: rust-bootstrap and cargo-bootstrap.

v3 -> v4:

- bump rust to 1.16.0
- bump rust-bootstrap to 1.15.1
- add cargo-bootstrap
- use built-in target specifications
- drop external Python script to generate target specifications
- enable support for PowerPC
- expose host variant in menuconfig

v2 -> v3:

- bump rust to 1.10.0
- rework and bump rust-bootstrap to 1.9.0
- host-rust requires at least GCC 4.7 because of LLVM (suggested by R. Naour)
- rust requires a glibc-based cross-compiler
- rust requires GCC 5.x or above for Aarch64

v1 -> v2:

- bump rust to version 1.9.0.
- drop patch for bzip2 support in host-python.
- add package for jemalloc.
- add dependency on host being a x86 machine.
- add dependency on toolchain.
- use dedicated package to provide bootstrapping binary: rust-bootstrap.
- let ./configure find out host/build on its own.
- remove entry from configuration menu.
- clarify some comments.

Eric Le Bihan (3):
rust-bootstrap: new package
cargo-bootstrap: new package
rust: new package

 DEVELOPERS                                   |  3 +
 package/Config.in.host                       |  1 +
 package/cargo-bootstrap/cargo-bootstrap.hash |  3 +
 package/cargo-bootstrap/cargo-bootstrap.mk   | 14 +++++
 package/rust-bootstrap/rust-bootstrap.hash   |  5 ++
 package/rust-bootstrap/rust-bootstrap.mk     | 37 ++++++++++++
 package/rust/Config.in.host                  | 33 +++++++++++
 package/rust/rust.hash                       |  2 +
 package/rust/rust.mk                         | 85 ++++++++++++++++++++++++++++
 9 files changed, 183 insertions(+)
 create mode 100644 package/cargo-bootstrap/cargo-bootstrap.hash
 create mode 100644 package/cargo-bootstrap/cargo-bootstrap.mk
 create mode 100644 package/rust-bootstrap/rust-bootstrap.hash
 create mode 100644 package/rust-bootstrap/rust-bootstrap.mk
 create mode 100644 package/rust/Config.in.host
 create mode 100644 package/rust/rust.hash
 create mode 100644 package/rust/rust.mk

--
2.9.3

#1 lore raw

PATCH v4 1/3 rust-bootstrap: new package

This new package fetches a binary snapshot of the Rust compiler, suitable for the host, in order to bootstrap the Rust compiler.

---
 DEVELOPERS                                 |  1 +
 package/rust-bootstrap/rust-bootstrap.hash |  5 ++++
 package/rust-bootstrap/rust-bootstrap.mk   | 37 ++++++++++++++++++++++++++++++
 3 files changed, 43 insertions(+)
 create mode 100644 package/rust-bootstrap/rust-bootstrap.hash
 create mode 100644 package/rust-bootstrap/rust-bootstrap.mk
DEVELOPERS +1 -0
index c89468b..863d5aa 100644
@@ -448,6 +448,7 @@ F:	package/execline/
 F:	package/hicolor-icon-theme/
 F:	package/jemalloc/
 F:	package/ninja/
+F:	package/rust-bootstrap
 F:	package/s6/
 F:	package/s6-dns/
 F:	package/s6-linux-init/
package/rust-bootstrap/rust-bootstrap.hash new file +5 -0
new file mode 100644
index 0000000..b418ea0
@@ -0,0 +1,5 @@
+# Locally calculated
+sha256 a833304f99071600c72ecd868c1c7bd5ce49d1102332637a8eb7adb942f349ab  rustc-1.15.1-i686-unknown-linux-gnu.tar.gz
+sha256 33ff44672b731fc71145974ce84194a1a9bafe6da3a74fd1e7543f12467f8894  rustc-1.15.1-x86_64-unknown-linux-gnu.tar.gz
+sha256 eff452a54b208a83b35432f226cb7de046d27b5e43edfc31d71ff340af686db0  rust-std-1.15.1-i686-unknown-linux-gnu.tar.gz
+sha256 69b251b478e284dfcaefc1153183f26f41d504ae213a81224f2101d8dbd52bb0  rust-std-1.15.1-x86_64-unknown-linux-gnu.tar.gz
package/rust-bootstrap/rust-bootstrap.mk new file +37 -0
new file mode 100644
index 0000000..1098423
@@ -0,0 +1,37 @@
+################################################################################
+#
+# rust-bootstrap
+#
+################################################################################
+
+RUST_BOOTSTRAP_VERSION = 1.15.1
+RUST_BOOTSTRAP_DATE = 2017-02-09
+RUST_BOOTSTRAP_TRIPLE = $(RUST_BOOTSTRAP_ARCH)-unknown-linux-gnu
+RUST_BOOTSTRAP_LABEL = $(RUST_BOOTSTRAP_VERSION)-$(RUST_BOOTSTRAP_TRIPLE)
+
+ifeq ($(HOSTARCH),x86_64)
+RUST_BOOTSTRAP_ARCH = x86_64
+else ifeq ($(HOSTARCH),x86)
+RUST_BOOTSTRAP_ARCH = i686
+endif
+
+RUST_BOOTSTRAP_SITE = https://static.rust-lang.org/dist/$(RUST_BOOTSTRAP_DATE)
+
+RUST_BOOTSTRAP_SOURCE = rustc-$(RUST_BOOTSTRAP_LABEL).tar.gz
+RUST_BOOTSTRAP_LICENSE = Apache-2.0 or MIT
+RUST_BOOTSTRAP_LICENSE_FILES = LICENSE-APACHE LICENSE-MIT
+RUST_BOOTSTRAP_LIBSTD_SOURCE= rust-std-$(RUST_BOOTSTRAP_LABEL).tar.gz
+RUST_BOOTSTRAP_LIBSTD_ROOT = rust-std-$(RUST_BOOTSTRAP_LABEL)/rust-std-$(RUST_BOOTSTRAP_TRIPLE)
+RUST_BOOTSTRAP_EXTRA_DOWNLOADS = $(RUST_BOOTSTRAP_SITE)/$(RUST_BOOTSTRAP_LIBSTD_SOURCE)
+
+define RUST_BOOTSTRAP_LIBSTD_EXTRACT
+	$(call suitable-extractor,$(RUST_BOOTSTRAP_LIBSTD_SOURCE)) \
+		$(DL_DIR)/$(RUST_BOOTSTRAP_LIBSTD_SOURCE) | \
+		$(TAR) --strip-components=2 -C $(@D)/rustc $(TAR_OPTIONS) - \
+			$(RUST_BOOTSTRAP_LIBSTD_ROOT)/lib
+endef
+
+HOST_RUST_BOOTSTRAP_EXTRA_DOWNLOADS = $(RUST_BOOTSTRAP_EXTRA_DOWNLOADS)
+HOST_RUST_BOOTSTRAP_POST_EXTRACT_HOOKS += RUST_BOOTSTRAP_LIBSTD_EXTRACT
+
+$(eval $(host-generic-package))
Signature · 1 line
2.9.3
#2 lore raw

PATCH v4 1/3 rust-bootstrap: new package

Quoted 65 lines · Eric Le Bihan

This new package fetches a binary snapshot of the Rust compiler, suitable for the host, in order to bootstrap the Rust compiler.

---

?DEVELOPERS?????????????????????????????????|??1 +
?package/rust-bootstrap/rust-bootstrap.hash |??5 ++++
?package/rust-bootstrap/rust-bootstrap.mk???| 37

++++++++++++++++++++++++++++++
?3 files changed, 43 insertions(+)
?create mode 100644 package/rust-bootstrap/rust-bootstrap.hash ?create mode 100644 package/rust-bootstrap/rust-bootstrap.mk

DEVELOPERS +0 -0
index c89468b..863d5aa 100644
@@ -448,6 +448,7 @@ F:	package/execline/

?F: package/hicolor-icon-theme/
?F: package/jemalloc/
?F: package/ninja/
+F: package/rust-bootstrap
?F: package/s6/
?F: package/s6-dns/
?F: package/s6-linux-init/

package/rust-bootstrap/rust-bootstrap.hash new file +2 -0
new file mode 100644
index 0000000..b418ea0
@@ -0,0 +1,5 @@
+# Locally calculated
+sha256

a833304f99071600c72ecd868c1c7bd5ce49d1102332637a8eb7adb942f349ab??rus tc-1.15.1-i686-unknown-linux-gnu.tar.gz
+sha256 33ff44672b731fc71145974ce84194a1a9bafe6da3a74fd1e7543f12467f8894??rus tc-1.15.1-x86_64-unknown-linux-gnu.tar.gz
+sha256 eff452a54b208a83b35432f226cb7de046d27b5e43edfc31d71ff340af686db0??rus t-std-1.15.1-i686-unknown-linux-gnu.tar.gz
+sha256 69b251b478e284dfcaefc1153183f26f41d504ae213a81224f2101d8dbd52bb0??rus t-std-1.15.1-x86_64-unknown-linux-gnu.tar.gz

package/rust- renamed from package/rust-bootstrap/rust-bootstrap.mk +0 -0

bootstrap/rust-bootstrap.mk
new file mode 100644
index 0000000..1098423

package/rust-bootstrap/rust-bootstrap.mk new file +1 -0
@@ -0,0 +1,37 @@
+####################################################################

############

package/rust-bootstrap/rust-bootstrap.mk new file +4 -0
+#
+# rust-bootstrap
+#
+####################################################################

############

package/rust-bootstrap/rust-bootstrap.mk new file +5 -0
+
+RUST_BOOTSTRAP_VERSION = 1.15.1
+RUST_BOOTSTRAP_DATE = 2017-02-09
+RUST_BOOTSTRAP_TRIPLE = $(RUST_BOOTSTRAP_ARCH)-unknown-linux-gnu
+RUST_BOOTSTRAP_LABEL = $(RUST_BOOTSTRAP_VERSION)-

$(RUST_BOOTSTRAP_TRIPLE)

package/rust-bootstrap/rust-bootstrap.mk line 16

Quoted 6 lines
package/rust-bootstrap/rust-bootstrap.mk new file +6 -0
+
+ifeq ($(HOSTARCH),x86_64)
+RUST_BOOTSTRAP_ARCH = x86_64
+else ifeq ($(HOSTARCH),x86)
+RUST_BOOTSTRAP_ARCH = i686
+endif

Is there any necessity to limit the bootstrap compiler to those host archs only?

Quoted 2 lines

+RUST_BOOTSTRAP_SITE = https://static.rust-
lang.org/dist/$(RUST_BOOTSTRAP_DATE)

Why use a date and not https://static.rust-lang.org/dist solely. Since I can fetch https://static.rust-lang.org/dist/rust-1.15.1-x86_64-unknow
n-linux-gnu.tar.gz.

Quoted 7 lines
package/rust-bootstrap/rust-bootstrap.mk new file +4 -0
+RUST_BOOTSTRAP_SOURCE = rustc-$(RUST_BOOTSTRAP_LABEL).tar.gz
+RUST_BOOTSTRAP_LICENSE = Apache-2.0 or MIT
+RUST_BOOTSTRAP_LICENSE_FILES = LICENSE-APACHE LICENSE-MIT
+RUST_BOOTSTRAP_LIBSTD_SOURCE= rust-std-

$(RUST_BOOTSTRAP_LABEL).tar.gz +RUST_BOOTSTRAP_LIBSTD_ROOT = rust-std-$(RUST_BOOTSTRAP_LABEL)/rust- std-$(RUST_BOOTSTRAP_TRIPLE)

Why not make a seperate package?

Quoted 12 lines

+RUST_BOOTSTRAP_EXTRA_DOWNLOADS = $(RUST_BOOTSTRAP_SITE)/$(RUST_BOOTSTRAP_LIBSTD_SOURCE)

package/rust-bootstrap/rust-bootstrap.mk new file +5 -0
+
+define RUST_BOOTSTRAP_LIBSTD_EXTRACT
+	$(call suitable-extractor,$(RUST_BOOTSTRAP_LIBSTD_SOURCE)) \
+		$(DL_DIR)/$(RUST_BOOTSTRAP_LIBSTD_SOURCE) | \
+		$(TAR) --strip-components=2 -C $(@D)/rustc

$(TAR_OPTIONS) - \

package/rust-bootstrap/rust-bootstrap.mk new file +4 -0
+			$(RUST_BOOTSTRAP_LIBSTD_ROOT)/lib
+endef
+
+HOST_RUST_BOOTSTRAP_EXTRA_DOWNLOADS =
Quoted 5 lines

$(RUST_BOOTSTRAP_EXTRA_DOWNLOADS)
+HOST_RUST_BOOTSTRAP_POST_EXTRACT_HOOKS +=
RUST_BOOTSTRAP_LIBSTD_EXTRACT
+
+$(eval $(host-generic-package))

J?rg

#3 lore raw

PATCH v4 1/3 rust-bootstrap: new package

Hello,

Quoted 11 lines · J?rg Krause
Quoted 10 lines · Eric Le Bihan

This new package fetches a binary snapshot of the Rust compiler, suitable for the host, in order to bootstrap the Rust compiler.

---

?DEVELOPERS?????????????????????????????????|??1 +
?package/rust-bootstrap/rust-bootstrap.hash |??5 ++++
?package/rust-bootstrap/rust-bootstrap.mk???| 37

++++++++++++++++++++++++++++++
?3 files changed, 43 insertions(+)

It would be nice if you could fix your e-mail client to not rewrap the text you are replying to :)

Quoted 8 lines

package/rust-bootstrap/rust-bootstrap.mk line 16

Quoted 5 lines
package/rust-bootstrap/rust-bootstrap.mk new file +5 -0
+ifeq ($(HOSTARCH),x86_64)
+RUST_BOOTSTRAP_ARCH = x86_64
+else ifeq ($(HOSTARCH),x86)
+RUST_BOOTSTRAP_ARCH = i686
+endif  

Is there any necessity to limit the bootstrap compiler to those host archs only?

The bootstrap compiler is provided as a binary only thing, pre-compiled. So it works only on the architectures it was compiled for. At least, that's why I remember from previous series on this topic.

Quoted 9 lines
Quoted 7 lines
package/rust-bootstrap/rust-bootstrap.mk new file +4 -0
+RUST_BOOTSTRAP_SOURCE = rustc-$(RUST_BOOTSTRAP_LABEL).tar.gz
+RUST_BOOTSTRAP_LICENSE = Apache-2.0 or MIT
+RUST_BOOTSTRAP_LICENSE_FILES = LICENSE-APACHE LICENSE-MIT
+RUST_BOOTSTRAP_LIBSTD_SOURCE= rust-std-

$(RUST_BOOTSTRAP_LABEL).tar.gz +RUST_BOOTSTRAP_LIBSTD_ROOT = rust-std-$(RUST_BOOTSTRAP_LABEL)/rust- std-$(RUST_BOOTSTRAP_TRIPLE)

Why not make a seperate package?

It apparently needs to be extracted within the bootstrap compiler tree, i.e in $(@D)/rustc, I guess that's why. But Eric can give more details here.

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
#4 lore raw

PATCH v4 1/3 rust-bootstrap: new package

Hi,

Quoted 15 lines · Thomas Petazzoni

Hello,

Quoted 11 lines · J?rg Krause
Quoted 10 lines · Eric Le Bihan

This new package fetches a binary snapshot of the Rust compiler, suitable for the host, in order to bootstrap the Rust compiler.

---

?DEVELOPERS?????????????????????????????????|??1 +
?package/rust-bootstrap/rust-bootstrap.hash |??5 ++++
?package/rust-bootstrap/rust-bootstrap.mk???| 37

++++++++++++++++++++++++++++++
?3 files changed, 43 insertions(+)

Quoted 2 lines

It would be nice if you could fix your e-mail client to not rewrap the text you are replying to :)

Naughty mail client. Told him not do such bad things anymore :-)

Quoted 9 lines
Quoted 8 lines

package/rust-bootstrap/rust-bootstrap.mk line 16

Quoted 5 lines
package/rust-bootstrap/rust-bootstrap.mk new file +5 -0
+ifeq ($(HOSTARCH),x86_64)
+RUST_BOOTSTRAP_ARCH = x86_64
+else ifeq ($(HOSTARCH),x86)
+RUST_BOOTSTRAP_ARCH = i686
+endif  

Is there any necessity to limit the bootstrap compiler to those host archs only?

Quoted 3 lines

The bootstrap compiler is provided as a binary only thing, pre-compiled. So it works only on the architectures it was compiled for. At least, that's why I remember from previous series on this topic.

But, if I am running Buildroot on a PowerPC it should be able to fetch and run the binary for PowerPC, right?

Quoted 10 lines
Quoted 9 lines
Quoted 7 lines
package/rust-bootstrap/rust-bootstrap.mk new file +4 -0
+RUST_BOOTSTRAP_SOURCE = rustc-$(RUST_BOOTSTRAP_LABEL).tar.gz
+RUST_BOOTSTRAP_LICENSE = Apache-2.0 or MIT
+RUST_BOOTSTRAP_LICENSE_FILES = LICENSE-APACHE LICENSE-MIT
+RUST_BOOTSTRAP_LIBSTD_SOURCE= rust-std-

$(RUST_BOOTSTRAP_LABEL).tar.gz +RUST_BOOTSTRAP_LIBSTD_ROOT = rust-std-$(RUST_BOOTSTRAP_LABEL)/rust- std-$(RUST_BOOTSTRAP_TRIPLE)

Why not make a seperate package?

Quoted 3 lines

It apparently needs to be extracted within the bootstrap compiler tree, i.e in $(@D)/rustc, I guess that's why. But Eric can give more details here.

Maybe the path to the rust libraries could be added to LD_LIBRARY_PATH?

J?rg

#5 lore raw

PATCH v4 1/3 rust-bootstrap: new package

Hello,

Quoted 9 lines · J?rg Krause
Quoted 6 lines
Quoted 2 lines

Is there any necessity to limit the bootstrap compiler to those host archs only?

The bootstrap compiler is provided as a binary only thing, pre-compiled. So it works only on the architectures it was compiled for. At least, that's why I remember from previous series on this topic.

But, if I am running Buildroot on a PowerPC it should be able to fetch and run the binary for PowerPC, right?

If there's no prebuilt Rust compiler for PowerPC, then no, it will simply not be possible.

We have already lots of things in Buildroot that depend on x86 or x86-64. Check all packages/options that use BR2_HOSTARCH.

So, it's fine for Rust to also require a x86/x86-64 machine, as long as the proper BR2_HOSTARCH dependency is present in the Config.in.

Best regards,

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
#6 lore raw

PATCH v4 1/3 rust-bootstrap: new package

Quoted 11 lines · Thomas Petazzoni

Hello,

Quoted 7 lines · J?rg Krause
Quoted 6 lines
Quoted 2 lines

Is there any necessity to limit the bootstrap compiler to those host archs only?

The bootstrap compiler is provided as a binary only thing, pre-compiled. So it works only on the architectures it was compiled for. At least, that's why I remember from previous series on this topic.

Quoted 5 lines
Quoted 2 lines

But, if I am running Buildroot on a PowerPC it should be able to fetch and run the binary for PowerPC, right?

If there's no prebuilt Rust compiler for PowerPC, then no, it will simply not be possible.

Fetching and extracting the PowerPC release tarball [1]:

[joerg at nzxt rust-1.16.0-powerpc64-unknown-linux-gnu]$ file rustc/bin/rustc?
rustc/bin/rustc: ELF 64-bit MSB shared object, 64-bit PowerPC or cisco 7500, version 1 (SYSV), dynamically linked, interpreter /lib64/ld64.so.1, for GNU/Linux 3.2.0, BuildID[sha1]=39357ec02406358be73f28d80dabfdd9e9816de9, not stripped, with debug_info

Quoted 5 lines

We have already lots of things in Buildroot that depend on x86 or x86-64. Check all packages/options that use BR2_HOSTARCH.

So, it's fine for Rust to also require a x86/x86-64 machine, as long as the proper BR2_HOSTARCH dependency is present in the Config.in.

As I am running x64 it is fine for me, too. Just wondered why to limit the hosts archs if there are binaries available.

[1] https://static.rust-lang.org/dist/rust-1.16.0-powerpc64-unknown-lin
ux-gnu.tar.gz

J?rg

#7 lore raw

PATCH v4 1/3 rust-bootstrap: new package

Hello,

Quoted 2 lines · J?rg Krause

As I am running x64 it is fine for me, too. Just wondered why to limit the hosts archs if there are binaries available.

I guess simply because Eric could only test those host architectures.

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
#8 lore raw

PATCH v4 1/3 rust-bootstrap: new package

In reply to Jörg Krause

Hi!

Quoted 67 lines · J?rg Krause
Quoted 66 lines · Eric Le Bihan

This new package fetches a binary snapshot of the Rust compiler, suitable for the host, in order to bootstrap the Rust compiler.

---

?DEVELOPERS?????????????????????????????????|??1 +
?package/rust-bootstrap/rust-bootstrap.hash |??5 ++++
?package/rust-bootstrap/rust-bootstrap.mk???| 37

++++++++++++++++++++++++++++++
?3 files changed, 43 insertions(+)
?create mode 100644 package/rust-bootstrap/rust-bootstrap.hash ?create mode 100644 package/rust-bootstrap/rust-bootstrap.mk

DEVELOPERS +0 -0
index c89468b..863d5aa 100644
@@ -448,6 +448,7 @@ F:	package/execline/

?F: package/hicolor-icon-theme/
?F: package/jemalloc/
?F: package/ninja/
+F: package/rust-bootstrap
?F: package/s6/
?F: package/s6-dns/
?F: package/s6-linux-init/

package/rust-bootstrap/rust-bootstrap.hash new file +2 -0
new file mode 100644
index 0000000..b418ea0
@@ -0,0 +1,5 @@
+# Locally calculated
+sha256

a833304f99071600c72ecd868c1c7bd5ce49d1102332637a8eb7adb942f349ab??rus tc-1.15.1-i686-unknown-linux-gnu.tar.gz
+sha256 33ff44672b731fc71145974ce84194a1a9bafe6da3a74fd1e7543f12467f8894??rus tc-1.15.1-x86_64-unknown-linux-gnu.tar.gz
+sha256 eff452a54b208a83b35432f226cb7de046d27b5e43edfc31d71ff340af686db0??rus t-std-1.15.1-i686-unknown-linux-gnu.tar.gz
+sha256 69b251b478e284dfcaefc1153183f26f41d504ae213a81224f2101d8dbd52bb0??rus t-std-1.15.1-x86_64-unknown-linux-gnu.tar.gz

package/rust- renamed from package/rust-bootstrap/rust-bootstrap.mk +0 -0

bootstrap/rust-bootstrap.mk
new file mode 100644
index 0000000..1098423

package/rust-bootstrap/rust-bootstrap.mk new file +1 -0
@@ -0,0 +1,37 @@
+####################################################################

############

package/rust-bootstrap/rust-bootstrap.mk new file +4 -0
+#
+# rust-bootstrap
+#
+####################################################################

############

package/rust-bootstrap/rust-bootstrap.mk new file +5 -0
+
+RUST_BOOTSTRAP_VERSION = 1.15.1
+RUST_BOOTSTRAP_DATE = 2017-02-09
+RUST_BOOTSTRAP_TRIPLE = $(RUST_BOOTSTRAP_ARCH)-unknown-linux-gnu
+RUST_BOOTSTRAP_LABEL = $(RUST_BOOTSTRAP_VERSION)-

$(RUST_BOOTSTRAP_TRIPLE)
+

Quoted 8 lines

package/rust-bootstrap/rust-bootstrap.mk line 16

Quoted 5 lines
package/rust-bootstrap/rust-bootstrap.mk new file +5 -0
+ifeq ($(HOSTARCH),x86_64)
+RUST_BOOTSTRAP_ARCH = x86_64
+else ifeq ($(HOSTARCH),x86)
+RUST_BOOTSTRAP_ARCH = i686
+endif

Is there any necessity to limit the bootstrap compiler to those host archs only?

I've limited the bootstrap compiler to i686 and x86_64 as these architectures are listed as tier 1 of the Rust platform support [1].

PowerPC is in tier 2. If some Buildroot users are using pre-2005 Macs, I can add it.

[1] https://forge.rust-lang.org/platform-support.html

Quoted 7 lines
Quoted 3 lines

+RUST_BOOTSTRAP_SITE = https://static.rust-
lang.org/dist/$(RUST_BOOTSTRAP_DATE)

Why use a date and not https://static.rust-lang.org/dist solely. Since I can fetch https://static.rust-lang.org/dist/rust-1.15.1-x86_64-unknow
n-linux-gnu.tar.gz.

Good catch! This part is a leftover from the early versions of this patch series when Rust compiler version N could not be bootstrapped from version N-1 but an obscure nightly one. I'll change this.

Quoted 10 lines
Quoted 8 lines
package/rust-bootstrap/rust-bootstrap.mk new file +4 -0
+RUST_BOOTSTRAP_SOURCE = rustc-$(RUST_BOOTSTRAP_LABEL).tar.gz
+RUST_BOOTSTRAP_LICENSE = Apache-2.0 or MIT
+RUST_BOOTSTRAP_LICENSE_FILES = LICENSE-APACHE LICENSE-MIT
+RUST_BOOTSTRAP_LIBSTD_SOURCE= rust-std-

$(RUST_BOOTSTRAP_LABEL).tar.gz +RUST_BOOTSTRAP_LIBSTD_ROOT = rust-std-$(RUST_BOOTSTRAP_LABEL)/rust- std-$(RUST_BOOTSTRAP_TRIPLE)

Why not make a seperate package?

I though about making it a separate package to clarify the Makefile, but the library on its own is useless, so why expose it? This is just an internal build dependency, like perl-cross in package/perl/perl.mk.

Quoted 11 lines
Quoted 11 lines

+RUST_BOOTSTRAP_EXTRA_DOWNLOADS = $(RUST_BOOTSTRAP_SITE)/$(RUST_BOOTSTRAP_LIBSTD_SOURCE)

package/rust-bootstrap/rust-bootstrap.mk new file +5 -0
+
+define RUST_BOOTSTRAP_LIBSTD_EXTRACT
+	$(call suitable-extractor,$(RUST_BOOTSTRAP_LIBSTD_SOURCE)) \
+		$(DL_DIR)/$(RUST_BOOTSTRAP_LIBSTD_SOURCE) | \
+		$(TAR) --strip-components=2 -C $(@D)/rustc

$(TAR_OPTIONS) - \

package/rust-bootstrap/rust-bootstrap.mk new file +3 -0
+			$(RUST_BOOTSTRAP_LIBSTD_ROOT)/lib
+endef
+
Quoted 8 lines
Quoted 6 lines

+HOST_RUST_BOOTSTRAP_EXTRA_DOWNLOADS =
$(RUST_BOOTSTRAP_EXTRA_DOWNLOADS)
+HOST_RUST_BOOTSTRAP_POST_EXTRACT_HOOKS +=
RUST_BOOTSTRAP_LIBSTD_EXTRACT
+
+$(eval $(host-generic-package))

J?rg

--
ELB

#9 lore raw

PATCH v4 2/3 cargo-bootstrap: new package

In reply to Eric Le Bihan

This new package fetches a binary snapshot of Cargo, suitable for the host, in order to bootstrap the Rust compiler and Cargo, the package manager.

---
 DEVELOPERS                                   |  1 +
 package/cargo-bootstrap/cargo-bootstrap.hash |  3 +++
 package/cargo-bootstrap/cargo-bootstrap.mk   | 14 ++++++++++++++
 3 files changed, 18 insertions(+)
 create mode 100644 package/cargo-bootstrap/cargo-bootstrap.hash
 create mode 100644 package/cargo-bootstrap/cargo-bootstrap.mk
DEVELOPERS +1 -0
index 863d5aa..1fed408 100644
@@ -442,6 +442,7 @@ F:	package/xxhash/
 
 N:	Eric Le Bihan <[email protected]>
 F:	package/adwaita-icon-theme/
+F:	package/cargo-bootstrap
 F:	package/darkhttpd/
 F:	package/eudev/
 F:	package/execline/
package/cargo-bootstrap/cargo-bootstrap.hash new file +3 -0
new file mode 100644
index 0000000..b193c6f
@@ -0,0 +1,3 @@
+# Locally generated
+sha256 0655713cacab054e8e5a33e742081eebec8531a8c77d28a4294e6496123e8ab1  cargo-nightly-x86_64-unknown-linux-gnu.tar.gz
+sha256 f20adfdcd6fb61c1252034e998998ec349c8a6b05c0320e47a539b0f6d1c76fa  cargo-nightly-i686-unknown-linux-gnu.tar.gz
package/cargo-bootstrap/cargo-bootstrap.mk new file +14 -0
new file mode 100644
index 0000000..8a11e6e
@@ -0,0 +1,14 @@
+################################################################################
+#
+# cargo-bootstrap
+#
+################################################################################
+
+CARGO_BOOTSTRAP_VERSION = 6e0c18cccc8b0c06fba8a8d76486f81a792fb420
+CARGO_BOOTSTRAP_SITE = https://s3.amazonaws.com/rust-lang-ci/cargo-builds/$(CARGO_BOOTSTRAP_VERSION)
+CARGO_BOOTSTRAP_SOURCE = cargo-nightly-$(HOSTARCH)-unknown-linux-gnu.tar.gz
+CARGO_BOOTSTRAP_LICENSE = Apache-2.0 or MIT
+CARGO_BOOTSTRAP_LICENSE_FILES = LICENSE-APACHE LICENSE-MIT
+CARGO_BOOTSTRAP_STRIP_COMPONENTS = 1
+
+$(eval $(host-generic-package))
Signature · 1 line
2.9.3
#10 lore raw

PATCH v4 2/3 cargo-bootstrap: new package

Hi Eric,

Quoted 3 lines · Eric Le Bihan

This new package fetches a binary snapshot of Cargo, suitable for the host, in order to bootstrap the Rust compiler and Cargo, the package manager.

Why not build it from source?

Quoted 60 lines

---

?DEVELOPERS???????????????????????????????????|??1 +
?package/cargo-bootstrap/cargo-bootstrap.hash |??3 +++
?package/cargo-bootstrap/cargo-bootstrap.mk???| 14 ++++++++++++++

?3 files changed, 18 insertions(+)
?create mode 100644 package/cargo-bootstrap/cargo-bootstrap.hash ?create mode 100644 package/cargo-bootstrap/cargo-bootstrap.mk

DEVELOPERS +0 -0
index 863d5aa..1fed408 100644
@@ -442,6 +442,7 @@ F:	package/xxhash/

?
?N: Eric Le Bihan <[email protected]>
?F: package/adwaita-icon-theme/
+F: package/cargo-bootstrap
?F: package/darkhttpd/
?F: package/eudev/
?F: package/execline/

package/cargo-bootstrap/cargo-bootstrap.hash new file +2 -0
new file mode 100644
index 0000000..b193c6f
@@ -0,0 +1,3 @@
+# Locally generated
+sha256

0655713cacab054e8e5a33e742081eebec8531a8c77d28a4294e6496123e8ab1??car go-nightly-x86_64-unknown-linux-gnu.tar.gz
+sha256 f20adfdcd6fb61c1252034e998998ec349c8a6b05c0320e47a539b0f6d1c76fa??car go-nightly-i686-unknown-linux-gnu.tar.gz

package/cargo-bootstrap/cargo-bootstrap.mk new file +1 -0
new file mode 100644
index 0000000..8a11e6e
@@ -0,0 +1,14 @@
+####################################################################

############

package/cargo-bootstrap/cargo-bootstrap.mk new file +4 -0
+#
+# cargo-bootstrap
+#
+####################################################################

############

package/cargo-bootstrap/cargo-bootstrap.mk new file +3 -0
+
+CARGO_BOOTSTRAP_VERSION = 6e0c18cccc8b0c06fba8a8d76486f81a792fb420
+CARGO_BOOTSTRAP_SITE = https://s3.amazonaws.com/rust-lang-ci/cargo-b

uilds/$(CARGO_BOOTSTRAP_VERSION) +CARGO_BOOTSTRAP_SOURCE = cargo-nightly-$(HOSTARCH)-unknown-linux- gnu.tar.gz

package/cargo-bootstrap/cargo-bootstrap.mk new file +5 -0
+CARGO_BOOTSTRAP_LICENSE = Apache-2.0 or MIT
+CARGO_BOOTSTRAP_LICENSE_FILES = LICENSE-APACHE LICENSE-MIT
+CARGO_BOOTSTRAP_STRIP_COMPONENTS = 1
+
+$(eval $(host-generic-package))
#11 lore raw

PATCH v4 2/3 cargo-bootstrap: new package

Hi!

Quoted 8 lines · J?rg Krause

Hi Eric,

Quoted 3 lines · Eric Le Bihan

This new package fetches a binary snapshot of Cargo, suitable for the host, in order to bootstrap the Rust compiler and Cargo, the package manager.

Why not build it from source?

Cargo uses Cargo as its build system, so you need to have a working version of Cargo on the host system to build a new version from the source code.

To build the Rust compiler a binary snapshot is enough.

I'll send a patch to add a package for the real Cargo soon.

Quoted 52 lines
Quoted 52 lines

---

?DEVELOPERS???????????????????????????????????|??1 +
?package/cargo-bootstrap/cargo-bootstrap.hash |??3 +++
?package/cargo-bootstrap/cargo-bootstrap.mk???| 14 ++++++++++++++

?3 files changed, 18 insertions(+)
?create mode 100644 package/cargo-bootstrap/cargo-bootstrap.hash ?create mode 100644 package/cargo-bootstrap/cargo-bootstrap.mk

DEVELOPERS +0 -0
index 863d5aa..1fed408 100644
@@ -442,6 +442,7 @@ F:	package/xxhash/

?
?N: Eric Le Bihan <[email protected]>
?F: package/adwaita-icon-theme/
+F: package/cargo-bootstrap
?F: package/darkhttpd/
?F: package/eudev/
?F: package/execline/

package/cargo-bootstrap/cargo-bootstrap.hash new file +2 -0
new file mode 100644
index 0000000..b193c6f
@@ -0,0 +1,3 @@
+# Locally generated
+sha256

0655713cacab054e8e5a33e742081eebec8531a8c77d28a4294e6496123e8ab1??car go-nightly-x86_64-unknown-linux-gnu.tar.gz
+sha256 f20adfdcd6fb61c1252034e998998ec349c8a6b05c0320e47a539b0f6d1c76fa??car go-nightly-i686-unknown-linux-gnu.tar.gz

package/cargo-bootstrap/cargo-bootstrap.mk new file +1 -0
new file mode 100644
index 0000000..8a11e6e
@@ -0,0 +1,14 @@
+####################################################################

############

package/cargo-bootstrap/cargo-bootstrap.mk new file +4 -0
+#
+# cargo-bootstrap
+#
+####################################################################

############

package/cargo-bootstrap/cargo-bootstrap.mk new file +3 -0
+
+CARGO_BOOTSTRAP_VERSION = 6e0c18cccc8b0c06fba8a8d76486f81a792fb420
+CARGO_BOOTSTRAP_SITE = https://s3.amazonaws.com/rust-lang-ci/cargo-b
Quoted 8 lines

package/cargo-bootstrap/cargo-bootstrap.mk line 14

Quoted 8 lines

uilds/$(CARGO_BOOTSTRAP_VERSION) +CARGO_BOOTSTRAP_SOURCE = cargo-nightly-$(HOSTARCH)-unknown-linux- gnu.tar.gz

package/cargo-bootstrap/cargo-bootstrap.mk new file +5 -0
+CARGO_BOOTSTRAP_LICENSE = Apache-2.0 or MIT
+CARGO_BOOTSTRAP_LICENSE_FILES = LICENSE-APACHE LICENSE-MIT
+CARGO_BOOTSTRAP_STRIP_COMPONENTS = 1
+
+$(eval $(host-generic-package))

--
ELB

#12 lore raw

PATCH v4 2/3 cargo-bootstrap: new package

Hello,

Quoted 10 lines · Eric Le Bihan

Hi!

Quoted 7 lines · J?rg Krause

Hi Eric,

Quoted 3 lines · Eric Le Bihan

This new package fetches a binary snapshot of Cargo, suitable for the host, in order to bootstrap the Rust compiler and Cargo, the package manager.

Quoted 7 lines
Quoted 1 line

Why not build it from source?

Cargo uses Cargo as its build system, so you need to have a working version of Cargo on the host system to build a new version from the source code.

To build the Rust compiler a binary snapshot is enough.

Can you update the commit log to make it clearer? I guess whenever there's a question on a patch, it often indicates that the commit log was not detailed enough.

Thanks!

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
#13 lore raw

PATCH v4 3/3 rust: new package

In reply to Eric Le Bihan

This new package provides the compiler for the Rust programming language.

Currently, only the host variant is built.

The Rust compiler uses LLVM as its backend: a copy of LLVM source code is provided and CMake is used to build it. It is possible to use a pre-built external copy. When LLVM/clang will be available in Buildroot, it would be possible to benefit from this feature and thus decrease build time.

LLVM is configured to generate code for x86, ARM, PowerPC and MIPS architectures.

The Rust compiler uses Cargo as its build system and is written in Rust. Therefore this package depends on cargo-bootstrap and rust-bootstrap.

The internal build process is as follows:

1. rustc-stage0, provided by rust-bootstrap, is used to build rustc-stage1.
2. rust-stage1 builds the final Rust compiler (rust-stage2) and the standard library for the host architecture.
3. the standard library for the target architecture is built.

The target architecture to support is given by the GNU/LLVM target triple. Rust supports some predefined targets [1]. As the build system expects the triple to be in the form of <arch>-unknown-<system> and Buildroot toolchain wrapper uses <arch>-buildroot-<system>, the package Makefile defines the $(RUST_TARGET_NAME) and uses it instead of $(GNU_TARGET_NAME).

When compiling Rust code with this compiler, the generated program only depends on the target C library, as it is statically linked to the Rust standard library and any other code from Rust packages (a.k.a. "crates").

If the jemalloc package is selected, support for this memory allocator will be enabled in the target standard library.

[1] https://forge.rust-lang.org/platform-support.html

---
 DEVELOPERS                  |  1 +
 package/Config.in.host      |  1 +
 package/rust/Config.in.host | 33 ++++++++++++++++++
 package/rust/rust.hash      |  2 ++
 package/rust/rust.mk        | 85 +++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 122 insertions(+)
 create mode 100644 package/rust/Config.in.host
 create mode 100644 package/rust/rust.hash
 create mode 100644 package/rust/rust.mk
DEVELOPERS +1 -0
index 1fed408..c0e7833 100644
@@ -450,6 +450,7 @@ F:	package/hicolor-icon-theme/
 F:	package/jemalloc/
 F:	package/ninja/
 F:	package/rust-bootstrap
+F:	package/rust
 F:	package/s6/
 F:	package/s6-dns/
 F:	package/s6-linux-init/
package/Config.in.host +1 -0
index 38f919a..ef5f23f 100644
@@ -39,6 +39,7 @@ menu "Host utilities"
 	source "package/python-lxml/Config.in.host"
 	source "package/qemu/Config.in.host"
 	source "package/raspberrypi-usbboot/Config.in.host"
+	source "package/rust/Config.in.host"
 	source "package/s6-rc/Config.in.host"
 	source "package/sam-ba/Config.in.host"
 	source "package/squashfs/Config.in.host"
package/rust/Config.in.host new file +33 -0
new file mode 100644
index 0000000..384a071
@@ -0,0 +1,33 @@
+config BR2_PACKAGE_HOST_RUST_ARCH_SUPPORTS
+	bool
+	default y
+	depends on BR2_HOSTARCH = "x86_64" || BR2_HOSTARCH = "x86"
+	depends on  BR2_i386 || BR2_x86_64 \
+		|| BR2_arm  || BR2_aarch64 \
+		|| BR2_powerpc  || BR2_powerpc64 \
+		|| BR2_mips || BR2_mipsel || BR2_mips64 || BR2_mips64el
+	depends on !BR2_ARM_CPU_ARMV4 && !BR2_ARM_CPU_ARMV5
+	depends on !BR2_MIPS_NABI32
+	depends on BR2_TOOLCHAIN_USES_GLIBC
+	depends on BR2_HOST_GCC_AT_LEAST_4_7 # required by LLVM
+	# triggers ICE on trunc_int_for_mode, at explow.c:56
+	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_5 || !BR2_aarch64
+
+comment "host-rust needs a toolchain w/ gcc >= 5"
+	depends on !BR2_TOOLCHAIN_GCC_AT_LEAST_5 && BR2_aarch64
+
+config BR2_PACKAGE_HOST_RUST
+	bool "host rust"
+	depends on BR2_PACKAGE_HOST_RUST_ARCH_SUPPORTS
+	help
+	  Compiler for the Rust programming language.
+
+	  This package will build the compiler for the host as well as
+	  a cross-compiled version of the Rust standard library for the
+	  target.
+
+	  Note that the target standard library does not need to be
+	  present on the target root filesystem, as it is statically
+	  linked to the program.
+
+	  http://www.rust-lang.org
package/rust/rust.hash new file +2 -0
new file mode 100644
index 0000000..3b04dfd
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256 f966b31eb1cd9bd2df817c391a338eeb5b9253ae0a19bf8a11960c560f96e8b4  rustc-1.16.0-src.tar.gz
package/rust/rust.mk new file +85 -0

85 lines not on this page · raw message

Signature · 1 line
2.9.3
#14 lore raw

PATCH v4 3/3 rust: new package

Hi Eric,

Quoted 20 lines · Eric Le Bihan

This new package provides the compiler for the Rust programming language.

Currently, only the host variant is built.

The Rust compiler uses LLVM as its backend: a copy of LLVM source code
is provided and CMake is used to build it. It is possible to use a pre-built external copy. When LLVM/clang will be available in Buildroot,
it would be possible to benefit from this feature and thus decrease build time.

LLVM is configured to generate code for x86, ARM, PowerPC and MIPS architectures.

The Rust compiler uses Cargo as its build system and is written in Rust.
Therefore this package depends on cargo-bootstrap and rust-bootstrap.

Quoted 7 lines

The internal build process is as follows:

?1. rustc-stage0, provided by rust-bootstrap, is used to build ????rustc-stage1.
?2. rust-stage1 builds the final Rust compiler (rust-stage2) ????and the standard library for the host architecture. ?3. the standard library for the target architecture is built.

So, we are doing the following: fetch the predecessor rust version 1.15.1 as binary to use it as stage0 compiler for building the latest rust stable version 1.16.0. Why not just fetch the latest stable version and install it into the host dir? The same goes with libstd and cargo. I mean, we have to fetch some binaries anyway, so why do the time-consuming build steps anyway? Shouldn't there be at least the option just to fetch the latest stable version?

Quoted 211 lines

The target architecture to support is given by the GNU/LLVM target triple. Rust supports some predefined targets [1]. As the build system
expects the triple to be in the form of <arch>-unknown-<system> and Buildroot toolchain wrapper uses <arch>-buildroot-<system>, the package
Makefile defines the $(RUST_TARGET_NAME) and uses it instead of $(GNU_TARGET_NAME).

When compiling Rust code with this compiler, the generated program only
depends on the target C library, as it is statically linked to the Rust
standard library and any other code from Rust packages (a.k.a. "crates").

If the jemalloc package is selected, support for this memory allocator
will be enabled in the target standard library.

[1] https://forge.rust-lang.org/platform-support.html

---

?DEVELOPERS??????????????????|??1 +
?package/Config.in.host??????|??1 +
?package/rust/Config.in.host | 33 ++++++++++++++++++
?package/rust/rust.hash??????|??2 ++
?package/rust/rust.mk????????| 85

+++++++++++++++++++++++++++++++++++++++++++++
?5 files changed, 122 insertions(+)
?create mode 100644 package/rust/Config.in.host
?create mode 100644 package/rust/rust.hash
?create mode 100644 package/rust/rust.mk

DEVELOPERS +0 -0
index 1fed408..c0e7833 100644
@@ -450,6 +450,7 @@ F:	package/hicolor-icon-theme/

?F: package/jemalloc/
?F: package/ninja/
?F: package/rust-bootstrap
+F: package/rust
?F: package/s6/
?F: package/s6-dns/
?F: package/s6-linux-init/

package/Config.in.host +0 -0
index 38f919a..ef5f23f 100644
@@ -39,6 +39,7 @@ menu "Host utilities"

? source "package/python-lxml/Config.in.host"
? source "package/qemu/Config.in.host"
? source "package/raspberrypi-usbboot/Config.in.host"

package/Config.in.host +1 -0
+	source "package/rust/Config.in.host"

? source "package/s6-rc/Config.in.host"
? source "package/sam-ba/Config.in.host"
? source "package/squashfs/Config.in.host"

package/rust/Config.in.host new file +8 -0
new file mode 100644
index 0000000..384a071
@@ -0,0 +1,33 @@
+config BR2_PACKAGE_HOST_RUST_ARCH_SUPPORTS
+	bool
+	default y
+	depends on BR2_HOSTARCH = "x86_64" || BR2_HOSTARCH = "x86"
+	depends on??BR2_i386 || BR2_x86_64 \
+		|| BR2_arm??|| BR2_aarch64 \
+		|| BR2_powerpc??|| BR2_powerpc64 \
+		|| BR2_mips || BR2_mipsel || BR2_mips64 ||

BR2_mips64el

package/rust/Config.in.host new file +17 -0
+	depends on !BR2_ARM_CPU_ARMV4 && !BR2_ARM_CPU_ARMV5
+	depends on !BR2_MIPS_NABI32
+	depends on BR2_TOOLCHAIN_USES_GLIBC
+	depends on BR2_HOST_GCC_AT_LEAST_4_7 # required by LLVM
+	# triggers ICE on trunc_int_for_mode, at explow.c:56
+	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_5 || !BR2_aarch64
+
+comment "host-rust needs a toolchain w/ gcc >= 5"
+	depends on !BR2_TOOLCHAIN_GCC_AT_LEAST_5 && BR2_aarch64
+
+config BR2_PACKAGE_HOST_RUST
+	bool "host rust"
+	depends on BR2_PACKAGE_HOST_RUST_ARCH_SUPPORTS
+	help
+	??Compiler for the Rust programming language.
+
+	??This package will build the compiler for the host as well

as

package/rust/Config.in.host new file +1 -0
+	??a cross-compiled version of the Rust standard library for

the

package/rust/Config.in.host new file +7 -0
+	??target.
+
+	??Note that the target standard library does not need to be
+	??present on the target root filesystem, as it is statically
+	??linked to the program.
+
+	??http://www.rust-lang.org
package/rust/rust.hash new file +2 -0
new file mode 100644
index 0000000..3b04dfd
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256

f966b31eb1cd9bd2df817c391a338eeb5b9253ae0a19bf8a11960c560f96e8b4??rus tc-1.16.0-src.tar.gz

package/rust/rust.mk new file +1 -0
new file mode 100644
index 0000000..12f4428
@@ -0,0 +1,85 @@
+####################################################################

############

package/rust/rust.mk new file +4 -0
+#
+# rust
+#
+####################################################################

############

package/rust/rust.mk new file +18 -0
+
+RUST_VERSION = 1.16.0
+RUST_SOURCE = rustc-$(RUST_VERSION)-src.tar.gz
+RUST_SITE = https://static.rust-lang.org/dist
+RUST_LICENSE = Apache-2.0 or MIT
+RUST_LICENSE_FILES = LICENSE-APACHE LICENSE-MIT
+
+HOST_RUST_DEPENDENCIES = \
+	toolchain \
+	host-rust-bootstrap \
+	host-cargo-bootstrap \
+	host-python \
+	host-cmake
+
+ifeq ($(BR2_PACKAGE_JEMALLOC),y)
+HOST_RUST_DEPENDENCIES += jemalloc
+HOST_RUST_JEMALLOC_ENABLED = true
+HOST_RUST_JEMALLOC_CONF = 'jemalloc =

"$(STAGING_DIR)/usr/lib/libjemalloc_pic.a"'

package/rust/rust.mk new file +20 -0
+else
+HOST_RUST_JEMALLOC_ENABLED = false
+endif
+
+HOST_RUST_BUILD_OPTS = $(if $(VERBOSE),--verbose)
+
+RUST_TARGET_NAME := $(subst buildroot,unknown,$(GNU_TARGET_NAME))
+
+ifeq ($(BR2_ARM_CPU_ARMV7A),y)
+RUST_TARGET_NAME := $(subst arm-,armv7-,$(RUST_TARGET_NAME))
+endif
+
+ifeq ($(BR2_MIPS_NABI64),y)
+RUST_TARGET_NAME := $(subst -gnu,-gnuabi64,$(RUST_TARGET_NAME))
+endif
+
+define HOST_RUST_CONFIGURE_CMDS
+	(cd $(@D); \
+		echo '[build]' > config.toml; \
+		echo 'target = ["$(RUST_TARGET_NAME)"]' >>

config.toml; \

package/rust/rust.mk new file +1 -0
+		echo 'cargo =

"$(HOST_CARGO_BOOTSTRAP_DIR)/cargo/bin/cargo"' >> config.toml; \

package/rust/rust.mk new file +1 -0
+		echo 'rustc =

"$(HOST_RUST_BOOTSTRAP_DIR)/rustc/bin/rustc"' >> config.toml; \

package/rust/rust.mk new file +1 -0
+		echo 'python = "$(HOST_DIR)/usr/bin/python2"' >>

config.toml; \

package/rust/rust.mk new file +8 -0
+		echo 'submodules = false' >> config.toml; \
+		echo 'vendor = true' >> config.toml; \
+		echo 'compiler-docs = false' >> config.toml; \
+		echo 'docs = false' >> config.toml; \
+		echo '[install]' >> config.toml; \
+		echo 'prefix = "$(HOST_DIR)/usr"' >> config.toml; \
+		echo '[rust]' >> config.toml; \
+		echo 'use-jemalloc = $(HOST_RUST_JEMALLOC_ENABLED)'
Quoted 1 line
Quoted 1 line

config.toml; \

package/rust/rust.mk new file +1 -0
+		echo '[target.$(RUST_TARGET_NAME)]' >> config.toml;

\

package/rust/rust.mk new file +8 -0
+		echo 'cc = "$(TARGET_CROSS)gcc"' >> config.toml; \
+		echo 'cxx = "$(TARGET_CROSS)g++"' >> config.toml; \
+		echo $(HOST_RUST_JEMALLOC_CONF) >> config.toml; \
+	)
+endef
+
+define HOST_RUST_BUILD_CMDS
+	(cd $(@D); $(HOST_MAKE_ENV) $(HOST_RUST_MAKE_ENV) python2

x.py \

package/rust/rust.mk new file +5 -0
+		build $(HOST_RUST_BUILD_OPTS))
+endef
+
+define HOST_RUST_INSTALL_LIBSTD_TARGET
+	(cd $(@D)/build/tmp/dist/rust-std-$(RUST_VERSION)-dev-

$(RUST_TARGET_NAME); \

package/rust/rust.mk new file +10 -0
+		./install.sh \
+			--prefix=$(HOST_DIR)/usr \
+			--docdir=$(HOST_DIR)/usr/share/doc/rust \
+			--libdir=$(HOST_DIR)/usr/lib \
+			--mandir=$(HOST_DIR)/usr/share/man \
+			--disable-ldconfig)
+endef
+
+define HOST_RUST_INSTALL_CMDS
+	(cd $(@D); $(HOST_MAKE_ENV) $(HOST_RUST_MAKE_ENV) python2

x.py \

package/rust/rust.mk new file +2 -0
+		dist $(HOST_RUST_BUILD_OPTS))
+	(cd $(@D); $(HOST_MAKE_ENV) $(HOST_RUST_MAKE_ENV) python2

x.py \

package/rust/rust.mk line 85

Quoted 5 lines
package/rust/rust.mk new file +5 -0
+		dist --install $(HOST_RUST_BUILD_OPTS))
+	$(HOST_RUST_INSTALL_LIBSTD_TARGET)
+endef
+
+$(eval $(host-generic-package))

Best regards,
J?rg Krause

#15 lore raw

PATCH v4 3/3 rust: new package

Hi!

Quoted 31 lines · J?rg Krause

Hi Eric,

Quoted 20 lines · Eric Le Bihan

This new package provides the compiler for the Rust programming language.

Currently, only the host variant is built.

The Rust compiler uses LLVM as its backend: a copy of LLVM source code
is provided and CMake is used to build it. It is possible to use a pre-built external copy. When LLVM/clang will be available in Buildroot,
it would be possible to benefit from this feature and thus decrease build time.

LLVM is configured to generate code for x86, ARM, PowerPC and MIPS architectures.

The Rust compiler uses Cargo as its build system and is written in Rust.
Therefore this package depends on cargo-bootstrap and rust-bootstrap.

Quoted 7 lines

The internal build process is as follows:

?1. rustc-stage0, provided by rust-bootstrap, is used to build ????rustc-stage1.
?2. rust-stage1 builds the final Rust compiler (rust-stage2) ????and the standard library for the host architecture. ?3. the standard library for the target architecture is built.

Quoted 8 lines

So, we are doing the following: fetch the predecessor rust version 1.15.1 as binary to use it as stage0 compiler for building the latest rust stable version 1.16.0. Why not just fetch the latest stable version and install it into the host dir? The same goes with libstd and cargo. I mean, we have to fetch some binaries anyway, so why do the time-consuming build steps anyway? Shouldn't there be at least the option just to fetch the latest stable version?

It is true that building the Rust compiler is time consuming. As stated in the comment, this can be decreased if LLVM was already available. But if LLVM itself is built from source and not fetched as binary from Internet, then the issue is still there.

Currently Buildroot only offers downloading binary versions of the C/C++ cross-compilers. It does not take into account alternative C/C++ cross-compilers like LLVM/Clang or compilers for new languages like Rust, D, or Haskell (though I do not know if Haskell is useful on embedded systems).

So, would it help to have a "Programming Languages" section in menuconfig where you can select Rust (or any other language) and choose between a using a pre-built compiler or build it from source?

And where shoud LLVM/clang be exposed?

Note: Building a cross-compiler for D can be done via a patch to GCC thanks to GDC [1], but IIRC cross-compiling libphobos, the standard library, is another matter.

[1] https://github.com/D-Programming-GDC/GDC/releases

Quoted 211 lines
Quoted 211 lines

The target architecture to support is given by the GNU/LLVM target triple. Rust supports some predefined targets [1]. As the build system
expects the triple to be in the form of <arch>-unknown-<system> and Buildroot toolchain wrapper uses <arch>-buildroot-<system>, the package
Makefile defines the $(RUST_TARGET_NAME) and uses it instead of $(GNU_TARGET_NAME).

When compiling Rust code with this compiler, the generated program only
depends on the target C library, as it is statically linked to the Rust
standard library and any other code from Rust packages (a.k.a. "crates").

If the jemalloc package is selected, support for this memory allocator
will be enabled in the target standard library.

[1] https://forge.rust-lang.org/platform-support.html

---

?DEVELOPERS??????????????????|??1 +
?package/Config.in.host??????|??1 +
?package/rust/Config.in.host | 33 ++++++++++++++++++
?package/rust/rust.hash??????|??2 ++
?package/rust/rust.mk????????| 85

+++++++++++++++++++++++++++++++++++++++++++++
?5 files changed, 122 insertions(+)
?create mode 100644 package/rust/Config.in.host
?create mode 100644 package/rust/rust.hash
?create mode 100644 package/rust/rust.mk

DEVELOPERS +0 -0
index 1fed408..c0e7833 100644
@@ -450,6 +450,7 @@ F:	package/hicolor-icon-theme/

?F: package/jemalloc/
?F: package/ninja/
?F: package/rust-bootstrap
+F: package/rust
?F: package/s6/
?F: package/s6-dns/
?F: package/s6-linux-init/

package/Config.in.host +0 -0
index 38f919a..ef5f23f 100644
@@ -39,6 +39,7 @@ menu "Host utilities"

? source "package/python-lxml/Config.in.host"
? source "package/qemu/Config.in.host"
? source "package/raspberrypi-usbboot/Config.in.host"

package/Config.in.host +1 -0
+	source "package/rust/Config.in.host"

? source "package/s6-rc/Config.in.host"
? source "package/sam-ba/Config.in.host"
? source "package/squashfs/Config.in.host"

package/rust/Config.in.host new file +8 -0
new file mode 100644
index 0000000..384a071
@@ -0,0 +1,33 @@
+config BR2_PACKAGE_HOST_RUST_ARCH_SUPPORTS
+	bool
+	default y
+	depends on BR2_HOSTARCH = "x86_64" || BR2_HOSTARCH = "x86"
+	depends on??BR2_i386 || BR2_x86_64 \
+		|| BR2_arm??|| BR2_aarch64 \
+		|| BR2_powerpc??|| BR2_powerpc64 \
+		|| BR2_mips || BR2_mipsel || BR2_mips64 ||

BR2_mips64el

package/rust/Config.in.host new file +17 -0
+	depends on !BR2_ARM_CPU_ARMV4 && !BR2_ARM_CPU_ARMV5
+	depends on !BR2_MIPS_NABI32
+	depends on BR2_TOOLCHAIN_USES_GLIBC
+	depends on BR2_HOST_GCC_AT_LEAST_4_7 # required by LLVM
+	# triggers ICE on trunc_int_for_mode, at explow.c:56
+	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_5 || !BR2_aarch64
+
+comment "host-rust needs a toolchain w/ gcc >= 5"
+	depends on !BR2_TOOLCHAIN_GCC_AT_LEAST_5 && BR2_aarch64
+
+config BR2_PACKAGE_HOST_RUST
+	bool "host rust"
+	depends on BR2_PACKAGE_HOST_RUST_ARCH_SUPPORTS
+	help
+	??Compiler for the Rust programming language.
+
+	??This package will build the compiler for the host as well

as

package/rust/Config.in.host new file +1 -0
+	??a cross-compiled version of the Rust standard library for

the

package/rust/Config.in.host new file +7 -0
+	??target.
+
+	??Note that the target standard library does not need to be
+	??present on the target root filesystem, as it is statically
+	??linked to the program.
+
+	??http://www.rust-lang.org
package/rust/rust.hash new file +2 -0
new file mode 100644
index 0000000..3b04dfd
@@ -0,0 +1,2 @@
+# Locally calculated
+sha256

f966b31eb1cd9bd2df817c391a338eeb5b9253ae0a19bf8a11960c560f96e8b4??rus tc-1.16.0-src.tar.gz

package/rust/rust.mk new file +1 -0
new file mode 100644
index 0000000..12f4428
@@ -0,0 +1,85 @@
+####################################################################

############

package/rust/rust.mk new file +4 -0
+#
+# rust
+#
+####################################################################

############

package/rust/rust.mk new file +18 -0
+
+RUST_VERSION = 1.16.0
+RUST_SOURCE = rustc-$(RUST_VERSION)-src.tar.gz
+RUST_SITE = https://static.rust-lang.org/dist
+RUST_LICENSE = Apache-2.0 or MIT
+RUST_LICENSE_FILES = LICENSE-APACHE LICENSE-MIT
+
+HOST_RUST_DEPENDENCIES = \
+	toolchain \
+	host-rust-bootstrap \
+	host-cargo-bootstrap \
+	host-python \
+	host-cmake
+
+ifeq ($(BR2_PACKAGE_JEMALLOC),y)
+HOST_RUST_DEPENDENCIES += jemalloc
+HOST_RUST_JEMALLOC_ENABLED = true
+HOST_RUST_JEMALLOC_CONF = 'jemalloc =

"$(STAGING_DIR)/usr/lib/libjemalloc_pic.a"'

package/rust/rust.mk new file +20 -0
+else
+HOST_RUST_JEMALLOC_ENABLED = false
+endif
+
+HOST_RUST_BUILD_OPTS = $(if $(VERBOSE),--verbose)
+
+RUST_TARGET_NAME := $(subst buildroot,unknown,$(GNU_TARGET_NAME))
+
+ifeq ($(BR2_ARM_CPU_ARMV7A),y)
+RUST_TARGET_NAME := $(subst arm-,armv7-,$(RUST_TARGET_NAME))
+endif
+
+ifeq ($(BR2_MIPS_NABI64),y)
+RUST_TARGET_NAME := $(subst -gnu,-gnuabi64,$(RUST_TARGET_NAME))
+endif
+
+define HOST_RUST_CONFIGURE_CMDS
+	(cd $(@D); \
+		echo '[build]' > config.toml; \
+		echo 'target = ["$(RUST_TARGET_NAME)"]' >>

config.toml; \

package/rust/rust.mk new file +1 -0
+		echo 'cargo =

"$(HOST_CARGO_BOOTSTRAP_DIR)/cargo/bin/cargo"' >> config.toml; \

package/rust/rust.mk new file +1 -0
+		echo 'rustc =

"$(HOST_RUST_BOOTSTRAP_DIR)/rustc/bin/rustc"' >> config.toml; \

package/rust/rust.mk new file +1 -0
+		echo 'python = "$(HOST_DIR)/usr/bin/python2"' >>

config.toml; \

package/rust/rust.mk new file +8 -0
+		echo 'submodules = false' >> config.toml; \
+		echo 'vendor = true' >> config.toml; \
+		echo 'compiler-docs = false' >> config.toml; \
+		echo 'docs = false' >> config.toml; \
+		echo '[install]' >> config.toml; \
+		echo 'prefix = "$(HOST_DIR)/usr"' >> config.toml; \
+		echo '[rust]' >> config.toml; \
+		echo 'use-jemalloc = $(HOST_RUST_JEMALLOC_ENABLED)'
Quoted 1 line
Quoted 1 line

config.toml; \

package/rust/rust.mk new file +1 -0
+		echo '[target.$(RUST_TARGET_NAME)]' >> config.toml;

\

package/rust/rust.mk new file +8 -0
+		echo 'cc = "$(TARGET_CROSS)gcc"' >> config.toml; \
+		echo 'cxx = "$(TARGET_CROSS)g++"' >> config.toml; \
+		echo $(HOST_RUST_JEMALLOC_CONF) >> config.toml; \
+	)
+endef
+
+define HOST_RUST_BUILD_CMDS
+	(cd $(@D); $(HOST_MAKE_ENV) $(HOST_RUST_MAKE_ENV) python2

x.py \

package/rust/rust.mk new file +5 -0
+		build $(HOST_RUST_BUILD_OPTS))
+endef
+
+define HOST_RUST_INSTALL_LIBSTD_TARGET
+	(cd $(@D)/build/tmp/dist/rust-std-$(RUST_VERSION)-dev-

$(RUST_TARGET_NAME); \

package/rust/rust.mk new file +10 -0
+		./install.sh \
+			--prefix=$(HOST_DIR)/usr \
+			--docdir=$(HOST_DIR)/usr/share/doc/rust \
+			--libdir=$(HOST_DIR)/usr/lib \
+			--mandir=$(HOST_DIR)/usr/share/man \
+			--disable-ldconfig)
+endef
+
+define HOST_RUST_INSTALL_CMDS
+	(cd $(@D); $(HOST_MAKE_ENV) $(HOST_RUST_MAKE_ENV) python2

x.py \

package/rust/rust.mk new file +2 -0
+		dist $(HOST_RUST_BUILD_OPTS))
+	(cd $(@D); $(HOST_MAKE_ENV) $(HOST_RUST_MAKE_ENV) python2

x.py \

Quoted 8 lines

package/rust/rust.mk line 85

Quoted 5 lines
package/rust/rust.mk new file +5 -0
+		dist --install $(HOST_RUST_BUILD_OPTS))
+	$(HOST_RUST_INSTALL_LIBSTD_TARGET)
+endef
+
+$(eval $(host-generic-package))

Best regards,
J?rg Krause

--
ELB

#16 lore raw

PATCH v4 3/3 rust: new package

Hi,

Quoted 48 lines · Eric Le Bihan

Hi!

Quoted 31 lines · J?rg Krause

Hi Eric,

Quoted 20 lines · Eric Le Bihan

This new package provides the compiler for the Rust programming language.

Currently, only the host variant is built.

The Rust compiler uses LLVM as its backend: a copy of LLVM source code
is provided and CMake is used to build it. It is possible to use a pre-built external copy. When LLVM/clang will be available in Buildroot,
it would be possible to benefit from this feature and thus decrease build time.

LLVM is configured to generate code for x86, ARM, PowerPC and MIPS architectures.

The Rust compiler uses Cargo as its build system and is written in Rust.
Therefore this package depends on cargo-bootstrap and rust-bootstrap.

Quoted 7 lines

The internal build process is as follows:

?1. rustc-stage0, provided by rust-bootstrap, is used to build ????rustc-stage1.
?2. rust-stage1 builds the final Rust compiler (rust-stage2) ????and the standard library for the host architecture. ?3. the standard library for the target architecture is built.

Quoted 8 lines

So, we are doing the following: fetch the predecessor rust version 1.15.1 as binary to use it as stage0 compiler for building the latest rust stable version 1.16.0. Why not just fetch the latest stable version and install it into the host dir? The same goes with libstd and cargo. I mean, we have to fetch some binaries anyway, so why do the time-consuming build steps anyway? Shouldn't there be at least the option just to fetch the latest stable version?

It is true that building the Rust compiler is time consuming. As stated in the comment, this can be decreased if LLVM was already available. But if LLVM itself is built from source and not fetched as binary from Internet, then the issue is still there.

Quoted 5 lines

Currently Buildroot only offers downloading binary versions of the C/C++ cross-compilers. It does not take into account alternative C/C++ cross-compilers like LLVM/Clang or compilers for new languages like Rust, D, or Haskell (though I do not know if Haskell is useful on embedded systems).

For now, we could use the host rustc package to fetch the latest stable binary for the host architecture. Additionally, we could add the option to build the Rust compiler within Buildroot. In my opinion, this option only makes sense if the compiler can be configured meaningfully.

Quoted 3 lines

So, would it help to have a "Programming Languages" section in menuconfig where you can select Rust (or any other language) and choose between a using a pre-built compiler or build it from source?

In my opinion it would make more sense to have a menu "Toolchains" with the submenus "C/C++ Toolchain", "Rust Toolchain", ...

Quoted 1 line

And where shoud LLVM/clang be exposed?

I would put it into "C/C++ Toolchain" (if we had such a menu).

Quoted 5 lines

Note: Building a cross-compiler for D can be done via a patch to GCC thanks to GDC [1], but IIRC cross-compiling libphobos, the standard library, is another matter.

[1] https://github.com/D-Programming-GDC/GDC/releases

J?rg

#17 lore raw

PATCH v4 3/3 rust: new package

Quoted 3 lines · J?rg Krause

Hi,

On Sat, 2017-04-08 at 12:09 +0200, Eric Le Bihan wrote:

[snip]

Quoted 5 lines
Quoted 5 lines

Currently Buildroot only offers downloading binary versions of the C/C++ cross-compilers. It does not take into account alternative C/C++ cross-compilers like LLVM/Clang or compilers for new languages like Rust, D, or Haskell (though I do not know if Haskell is useful on embedded systems).

There's a huge difference between alternative C/C++ compilers and compilers for
other languages.

Compilers for other languages we already have: python, mono, erlang. These are
just normal packages, and any package in that language depends on the host-xxx package to provide the compiler. Similar to how packages that use the cmake buildsystem depend on the host-cmake package.

Alternative C/C++ compilers are something else entirely, because they replace
the special 'toolchain' target.

Only when you can build an entire system with only the Rust compiler and
without C/C++ compiler you can consider them equivalent. That day is still far away.

Quoted 4 lines

For now, we could use the host rustc package to fetch the latest stable binary for the host architecture. Additionally, we could add the option to build the Rust compiler within Buildroot. In my opinion, this option only makes sense if the compiler can be configured meaningfully.

I agree.

Quoted 6 lines
Quoted 3 lines

So, would it help to have a "Programming Languages" section in menuconfig where you can select Rust (or any other language) and choose between a using a pre-built compiler or build it from source?

In my opinion it would make more sense to have a menu "Toolchains" with the submenus "C/C++ Toolchain", "Rust Toolchain", ...

Given what I wrote above, I disagree. For the time being it's fine in the host
packages menu. If that menu becomes too large, we could add something like an 'Alternative programming languages' menu.

Quoted 3 lines
Quoted 1 line

And where shoud LLVM/clang be exposed?

I would put it into "C/C++ Toolchain" (if we had such a menu).

That's slightly more complicated. LLVM is just a library so it's just in the
host menu. clang is a compiler that can be a replacement for gcc, so it'd have to go into the toolchain menu.

Actually, Romain is working on LLVM/Clang. He's going to start adding it as a
normal host package, so not as a replacement of gcc as the toolchain.

Regards,
Arnout

Quoted 13 lines
Quoted 6 lines

Note: Building a cross-compiler for D can be done via a patch to GCC thanks to GDC [1], but IIRC cross-compiling libphobos, the standard library, is another matter.

[1] https://github.com/D-Programming-GDC/GDC/releases

J?rg
_______________________________________________
buildroot mailing list
buildroot at busybox.net
http://lists.busybox.net/mailman/listinfo/buildroot

Signature · 6 lines
Arnout Vandecappelle                          arnout at mind be
Senior Embedded Software Architect            +32-16-286500
Essensium/Mind                                http://www.mind.be
G.Geenslaan 9, 3001 Leuven, Belgium           BE 872 984 063 RPR Leuven
LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
GPG fingerprint:  7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF
#18 lore raw

PATCH v4 3/3 rust: new package

Hi,

Quoted 21 lines · Arnout Vandecappelle
Quoted 3 lines · J?rg Krause

Hi,

On Sat, 2017-04-08 at 12:09 +0200, Eric Le Bihan wrote:

[snip]

Quoted 5 lines
Quoted 5 lines

Currently Buildroot only offers downloading binary versions of the C/C++ cross-compilers. It does not take into account alternative C/C++ cross-compilers like LLVM/Clang or compilers for new languages like Rust, D, or Haskell (though I do not know if Haskell is useful on embedded systems).

There's a huge difference between alternative C/C++ compilers and compilers for
other languages.

Compilers for other languages we already have: python, mono, erlang. These are
just normal packages, and any package in that language depends on the host-xxx package to provide the compiler. Similar to how packages that use the cmake buildsystem depend on the host-cmake package.

Quoted 5 lines

Alternative C/C++ compilers are something else entirely, because they replace
the special 'toolchain' target.

Only when you can build an entire system with only the Rust compiler and
without C/C++ compiler you can consider them equivalent. That day is still far away.

I see!

Quoted 6 lines
Quoted 4 lines

For now, we could use the host rustc package to fetch the latest stable binary for the host architecture. Additionally, we could add the option to build the Rust compiler within Buildroot. In my opinion, this option only makes sense if the compiler can be configured meaningfully.

I agree.

Cool.

@Eric: Do you mind to do that? By default fetch the latest stable release, and alternatively offer an option to build a "Custom Rust package". I think it would also be helpful to have at least one Rust package to add as a proof of concept.

Quoted 5 lines
Quoted 5 lines
Quoted 4 lines

So, would it help to have a "Programming Languages" section in menuconfig where you can select Rust (or any other language) and choose between a using a pre-built compiler or build it from source?

Quoted 7 lines
Quoted 2 lines

In my opinion it would make more sense to have a menu "Toolchains" with the submenus "C/C++ Toolchain", "Rust Toolchain", ...

Given what I wrote above, I disagree. For the time being it's fine in the host
packages menu. If that menu becomes too large, we could add something like an 'Alternative programming languages' menu.

Sounds reasonable.

Quoted 11 lines
Quoted 4 lines
Quoted 2 lines

And where shoud LLVM/clang be exposed?

I would put it into "C/C++ Toolchain" (if we had such a menu).

That's slightly more complicated. LLVM is just a library so it's just in the
host menu. clang is a compiler that can be a replacement for gcc, so it'd have to go into the toolchain menu.

Actually, Romain is working on LLVM/Clang. He's going to start adding it as a
normal host package, so not as a replacement of gcc as the toolchain.

Nice!

J?rg

#19 lore raw

PATCH v4 3/3 rust: new package

Le 2017-04-13 06:05, J?rg Krause a ?crit?:

Quoted 5 lines

Hi,

Quoted 2 lines · Arnout Vandecappelle

On 10-04-17 21:02, J?rg Krause wrote:

[snip]

Quoted 5 lines
Quoted 5 lines
Quoted 4 lines

For now, we could use the host rustc package to fetch the latest stable binary for the host architecture. Additionally, we could add the option to build the Rust compiler within Buildroot. In my opinion, this option only makes sense if the compiler can be configured meaningfully.

Quoted 8 lines
Quoted 1 line

I agree.

Cool.

@Eric: Do you mind to do that? By default fetch the latest stable release, and alternatively offer an option to build a "Custom Rust package". I think it would also be helpful to have at least one Rust package to add as a proof of concept.

Currently this patch series provides:

- rust-bootstrap, which fetches the binary version N-1 of rust.
- cargo-bootstrap, which fetches a nightly binary version of cargo.
- rust, which uses the two previous packages to build version N of rust.

I also have another patch series which adds a new package for cargo, which
uses cargo-bootstrap and rust to build Cargo from source.

IMHO, modifying the current version of the rust package to download the latest version and providing an option to build from source would make the Makefile of the package more complicated.

Would it not be better to use host virtual packages? Something like:

- rust-rustc: host virtual package, with two providers:
* rustc-bin: fetches binary version N of rustc and libstd (host and target).
* rustc: builds version N of rustc and libstd (host and target). Depends on rust-bootstrap (version N-1) and cargo-bootstrap.
- rust-cargo: host virtual package with two providers:
* cargo-bin: fetches binary version N of Cargo.
* cargo: builds version N of Cargo using rust and cargo-bootstrap.

And instead of littering the package directory with rust-* and cargo-*, how about putting all these packages in a parent directory named package/rust?

The file package/Config.in.host should also be modified to include package/rust/Config.in.host, which would present the options to select the providers for rust-rustc and rust-cargo.

#20 lore raw

PATCH v4 3/3 rust: new package

Quoted 27 lines · Eric Le Bihan

Le 2017-04-13 06:05, J?rg Krause a ?crit :

Quoted 5 lines

Hi,

Quoted 2 lines · Arnout Vandecappelle

On 10-04-17 21:02, J?rg Krause wrote:

[snip]

Quoted 5 lines
Quoted 5 lines
Quoted 4 lines

For now, we could use the host rustc package to fetch the latest stable binary for the host architecture. Additionally, we could add the option to build the Rust compiler within Buildroot. In my opinion, this option only makes sense if the compiler can be configured meaningfully.

Quoted 8 lines
Quoted 1 line

I agree.

Cool.

@Eric: Do you mind to do that? By default fetch the latest stable release, and alternatively offer an option to build a "Custom Rust package". I think it would also be helpful to have at least one Rust package to add as a proof of concept.

Currently this patch series provides:

- rust-bootstrap, which fetches the binary version N-1 of rust.
- cargo-bootstrap, which fetches a nightly binary version of cargo.
- rust, which uses the two previous packages to build version N of rust.

Quoted 6 lines

I also have another patch series which adds a new package for cargo, which uses cargo-bootstrap and rust to build Cargo from source.

IMHO, modifying the current version of the rust package to download the latest version and providing an option to build from source would make the Makefile of the package more complicated.

I think Joerg's point is that we could just as well have *only* rust-bootstrap
(which would then be named "rust", of course). Why would you fetch version N-1 to build version N, if you can just fetch version N?

If there is a reason to actually build it (like we need to set some options),
then it makes sense to have the -bootstrap.

Quoted 11 lines

Would it not be better to use host virtual packages? Something like:

- rust-rustc: host virtual package, with two providers:
* rustc-bin: fetches binary version N of rustc and libstd (host and target).
* rustc: builds version N of rustc and libstd (host and target). Depends on rust-bootstrap (version N-1) and cargo-bootstrap.
- rust-cargo: host virtual package with two providers:
* cargo-bin: fetches binary version N of Cargo.
* cargo: builds version N of Cargo using rust and cargo-bootstrap.

This actually sounds like an elegant solution to me. And it scales, i.e. you
can start just adding rustc-bin and cargo-bin, and later add rustc and cargo if it's useful for something.

Quoted 3 lines

And instead of littering the package directory with rust-* and cargo-*, how about putting all these packages in a parent directory named package/rust?

Since you haven't proposed any package yet that depends on rust, it's hard to
say. We prefer to avoid subdirectories because it makes things harder to find - we actually moved things out of a few subdirectories some years ago. The ones that are left are the obvious ones: qt5, gstreamer{,1}, x11r7.

For Rust, I don't see how it makes much sense. It could make sense for things
like perl, python and lua because there the packages are really tied to the language (except for a few user-facing applications, but these don't usually have a python- prefix).

For Rust, however, I think the packages that depend on it are not so tied to
the language. They'll either be user-facing applications, or libraries that may just as well be linked with C code. No? So the rust/ directory would have just rust and cargo...

What *does* make sense, is to keep rust and cargo together in Config.in.host.

Regards,
Arnout

Quoted 5 lines

The file package/Config.in.host should also be modified to include package/rust/Config.in.host, which would present the options to select the providers for rust-rustc and rust-cargo.

Signature · 6 lines
Arnout Vandecappelle                          arnout at mind be
Senior Embedded Software Architect            +32-16-286500
Essensium/Mind                                http://www.mind.be
G.Geenslaan 9, 3001 Leuven, Belgium           BE 872 984 063 RPR Leuven
LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle
GPG fingerprint:  7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF