97d861f58bd2c07ff78099ef9fe25dec30d5eea4
[feed/packages.git] / lang / rust / Makefile
1 # SPDX-License-Identifier: GPL-2.0-only
2 #
3 # Copyright (C) 2023 Luca Barbato and Donald Hoskins
4
5 include $(TOPDIR)/rules.mk
6
7 PKG_NAME:=rust
8 PKG_VERSION:=1.67.1
9 PKG_RELEASE:=1
10
11 PKG_SOURCE:=rustc-$(PKG_VERSION)-src.tar.gz
12 PKG_SOURCE_URL:=https://static.rust-lang.org/dist/
13 PKG_HASH:=46483d3e5de85a3bd46f8e7a3ae1837496391067dbe713a25d3cf051b3d9ff6e
14 HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/rustc-$(PKG_VERSION)-src/
15
16 PKG_MAINTAINER:=Luca Barbato <lu_zero@luminem.org>
17 PKG_LICENSE:=Apache-2.0 MIT
18 PKG_LICENSE_FILES:=LICENSE-APACHE LICENSE-MIT
19
20 HOST_BUILD_DEPENDS:=python3/host
21 PKG_HOST_ONLY:=1
22
23 include $(INCLUDE_DIR)/package.mk
24 include $(INCLUDE_DIR)/host-build.mk
25
26 # rust environment variables
27 include ./rust-host.mk
28
29 # Rust Temp Directory
30 RUST_TMP_DIR:=$(TMP_DIR)/rust-install
31
32 RUST_INSTALL_HOST_FILENAME:=$(PKG_NAME)-$(PKG_VERSION)-$(RUSTC_HOST_ARCH)-install.tar.xz
33 RUST_INSTALL_TARGET_FILENAME:=$(PKG_NAME)-$(PKG_VERSION)-$(RUSTC_TARGET_ARCH)-install.tar.xz
34
35 # Rust-lang has an uninstall script
36 RUST_UNINSTALL:=$(CARGO_HOME)/lib/rustlib/uninstall.sh
37
38 # Target Flags
39 TARGET_CONFIGURE_ARGS = \
40 --set=target.$(RUSTC_TARGET_ARCH).ar=$(TARGET_AR) \
41 --set=target.$(RUSTC_TARGET_ARCH).cc=$(TARGET_CC_NOCACHE) \
42 --set=target.$(RUSTC_TARGET_ARCH).cxx=$(TARGET_CXX_NOCACHE) \
43 --set=target.$(RUSTC_TARGET_ARCH).linker=$(TARGET_CC_NOCACHE) \
44 --set=target.$(RUSTC_TARGET_ARCH).musl-root=$(TOOLCHAIN_DIR) \
45 --set=target.$(RUSTC_TARGET_ARCH).ranlib=$(TARGET_RANLIB)
46
47 # CARGO_HOME is an environmental
48 HOST_CONFIGURE_OPTS += CARGO_HOME="$(CARGO_HOME)"
49
50 # Rust Configuration Arguments
51 HOST_CONFIGURE_ARGS = \
52 --build=$(RUSTC_HOST_ARCH) \
53 --target=$(RUSTC_TARGET_ARCH),$(RUSTC_HOST_ARCH) \
54 --host=$(RUSTC_HOST_ARCH) \
55 --prefix=$(CARGO_HOME) \
56 --bindir=$(CARGO_HOME)/bin \
57 --libdir=$(CARGO_HOME)/lib \
58 --sysconfdir=$(CARGO_HOME)/etc \
59 --datadir=$(CARGO_HOME)/share \
60 --mandir=$(CARGO_HOME)/man \
61 --dist-compression-formats=xz \
62 --enable-llvm-link-shared \
63 --enable-llvm-plugins \
64 --enable-missing-tools \
65 --enable-ninja \
66 --disable-sanitizers \
67 --release-channel=stable \
68 --enable-cargo-native-static \
69 $(TARGET_CONFIGURE_ARGS)
70
71 define Host/Prepare
72 # Ensure rust temp directory
73 [ -d $(RUST_TMP_DIR) ] || \
74 mkdir -p $(RUST_TMP_DIR)
75
76 $(call Host/Prepare/Default)
77 endef
78
79 define Host/Uninstall
80 # Call the Uninstall script
81 [ -f $(RUST_UNINSTALL) ] && \
82 $(BASH) $(RUST_UNINSTALL) || echo No Uninstall
83
84 rm -rf $(RUST_TMP_DIR)
85 endef
86
87 # Makes and then packages the dist artifacts
88 define Host/Compile
89 cd $(HOST_BUILD_DIR) && \
90 $(PYTHON) x.py --config ./config.toml dist build-manifest cargo llvm-tools \
91 rustc rust-std rust-src
92
93 $(call Host/PackageDist)
94 endef
95
96 # Distribution Artifacts are packaged by Host/PackageDist
97 # We just need to extract and install
98 define Host/Install
99 $(TAR) -C $(RUST_TMP_DIR) -xJf $(DL_DIR)/$(RUST_INSTALL_HOST_FILENAME) && \
100 $(TAR) -C $(RUST_TMP_DIR) -xJf $(DL_DIR)/$(RUST_INSTALL_TARGET_FILENAME)
101
102 cd $(RUST_TMP_DIR) && \
103 find -iname "*.xz" -exec tar -xJf {} ";" && \
104 find ./* -type f -name install.sh -execdir sh {} --prefix=$(CARGO_HOME) --disable-ldconfig \;
105
106 echo -e "[target.$(RUSTC_TARGET_ARCH)]\nlinker = \"$(TARGET_CC_NOCACHE)\"\nrustflags = [\"-Ctarget-feature=-crt-static\", \"-Clink-args=$(RUSTC_LDFLAGS)\"]" > $(CARGO_HOME)/config
107 echo -e "\n[profile.stripped]\ninherits = \"release\"\nopt-level = \"s\"\nstrip = true" >> $(CARGO_HOME)/config
108 endef
109
110 # Packages the Distribution Artifacts into HOST and TARGET bundles.
111 define Host/PackageDist
112 ( \
113 cd $(HOST_BUILD_DIR)/build/dist ; \
114 $(TAR) -cJf $(DL_DIR)/$(RUST_INSTALL_TARGET_FILENAME) \
115 rust-*-$(RUSTC_TARGET_ARCH).tar.xz ; \
116 $(TAR) -cJf $(DL_DIR)/$(RUST_INSTALL_HOST_FILENAME) \
117 --exclude rust-*-$(RUSTC_TARGET_ARCH).tar.xz *.xz ; \
118 )
119 endef
120
121 define Package/rust
122 SECTION:=lang
123 CATEGORY:=Languages
124 TITLE:=Rust Programming Language Compiler
125 URL:=https://www.rust-lang.org/
126 DEPENDS:=$(RUST_ARCH_DEPENDS) \
127 +pkg-config +libunwind +libopenssl +liblzma +libc
128 endef
129
130 define Package/rust/description
131 Rust is a multi-paradigm, general-purpose programming language designed for performance
132 and safety, especially safe concurrency. Rust is syntactically similar to C++, but can
133 guarantee memory safety by using a borrow checker to validate references.
134 endef
135
136 define Package/rust/config
137 source "$(SOURCE)/Config.in"
138 endef
139
140 $(eval $(call HostBuild))
141 $(eval $(call BuildPackage,rust))