1 # Created by: Jyun-Yan You <jyyou@cs.nctu.edu.tw>
8 MASTER_SITES= http://static.rust-lang.org/dist/:src \
9 LOCAL/dumbbell/rust:rust_bootstrap \
10 https://static.rust-lang.org/dist/:rust_bootstrap \
11 LOCAL/dumbbell/rust:cargo_bootstrap \
12 https://static.rust-lang.org/dist/:cargo_bootstrap \
13 https://s3.amazonaws.com/rust-lang-ci/cargo-builds/:cargo_bootstrap \
14 LOCAL/marino:bootstrap
15 DISTNAME?= ${PORTNAME}c-${PORTVERSION}-src
16 DISTFILES?= ${NIGHTLY_SUBDIR}${DISTNAME}${EXTRACT_SUFX}:src \
17 ${RUSTC_BOOTSTRAP}:rust_bootstrap \
18 ${RUST_STD_BOOTSTRAP}:rust_bootstrap \
19 ${CARGO_BOOTSTRAP}:cargo_bootstrap
21 EXTRACT_ONLY?= ${DISTFILES:N*\:*bootstrap:C/:.*//}
23 MAINTAINER= rust@FreeBSD.org
24 COMMENT= Language with a focus on memory safety and concurrency
29 LICENSE_FILE_APACHE= ${WRKSRC}/LICENSE-APACHE
30 LICENSE_FILE_MIT= ${WRKSRC}/LICENSE-MIT
32 BUILD_DEPENDS= cmake:devel/cmake
33 LIB_DEPENDS= libcurl.so:ftp/curl \
34 libgit2.so:devel/libgit2 \
35 libssh2.so:security/libssh2
37 ONLY_FOR_ARCHS?= aarch64 amd64 i386
38 ONLY_FOR_ARCHS_REASON= requires prebuilt bootstrap compiler
40 BROKEN_aarch64= fails to build: bootstrap compiler crashes
42 CONFLICTS_INSTALL?= rust-nightly
44 # See WRKSRC/src/stage0.txt for this date and version values.
45 BOOTSTRAPS_DATE?= 2018-10-25
47 RUST_BOOTSTRAP_VERSION?= 1.30.0
48 RUSTC_BOOTSTRAP= ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/rustc-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET}.tar.gz
49 RUST_STD_BOOTSTRAP= ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/rust-std-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET}.tar.gz
51 CARGO_BOOTSTRAP_VERSION?= 0.31.0
52 CARGO_BOOTSTRAP= ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/cargo-${CARGO_BOOTSTRAP_VERSION_${ARCH}:U${CARGO_BOOTSTRAP_VERSION}}-${RUST_TARGET}.tar.gz
54 CARGO_VENDOR_DIR?= ${WRKSRC}/src/vendor
56 RUST_CHANNEL= ${PKGNAMESUFFIX:Ustable:S/^-//}
58 # Rust's target arch string is different from *BSD arch strings
59 RUST_ARCH_aarch64= aarch64
60 RUST_ARCH_x86_64= x86_64
62 RUST_ARCH_x86_64= x86_64 # dragonfly
63 RUST_TARGET= ${RUST_ARCH_${ARCH}}-unknown-${OPSYS:tl}
64 PLIST_SUB+= RUST_TARGET=${RUST_TARGET}
66 USES= compiler gmake libedit pkgconfig python:2.7,build ssl tar:xz
68 OPTIONS_DEFINE= DOCS GDB LLNEXTGEN SOURCES
69 GDB_DESC= Install ports gdb (necessary for debugging rust programs)
70 LLNEXTGEN_DESC= Build with grammar verification
71 SOURCES_DESC= Install source files
73 GDB_RUN_DEPENDS= ${LOCALBASE}/bin/gdb:devel/gdb
74 LLNEXTGEN_BUILD_DEPENDS= LLnextgen:devel/llnextgen
76 # Rust manifests list all files and directories installed by rust-installer.
78 # - pre-install to cleanup the ${STAGEDIR}
79 # - post-install to populate the ${TMPPLIST}
80 RUST_MANIFESTS= lib/rustlib/manifest-cargo \
81 lib/rustlib/manifest-clippy-preview \
82 lib/rustlib/manifest-rls-preview \
83 lib/rustlib/manifest-rustc \
84 lib/rustlib/manifest-rustfmt-preview \
85 lib/rustlib/manifest-rust-analysis-${RUST_TARGET} \
86 lib/rustlib/manifest-rust-std-${RUST_TARGET}
87 RUST_DOCS_MANIFEST= lib/rustlib/manifest-rust-docs
88 RUST_SRC_MANIFEST= lib/rustlib/manifest-rust-src
89 DOCS_VARS= rust_manifests+=${RUST_DOCS_MANIFEST}
90 SOURCES_VARS= rust_manifests+=${RUST_SRC_MANIFEST}
92 PLIST_FILES= lib/rustlib/components \
93 lib/rustlib/rust-installer-version
95 .include <bsd.port.pre.mk>
97 X_PY_ENV+= HOME="${WRKDIR}" \
98 LIBGIT2_SYS_USE_PKG_CONFIG=1 \
99 LIBSSH2_SYS_USE_PKG_CONFIG=1 \
100 OPENSSL_DIR="${OPENSSLBASE}"
101 X_PY_CMD= ${PYTHON_CMD} ${WRKSRC}/x.py
103 RUST_STD_DIR= ${RUST_STD_BOOTSTRAP:T:R:R}
107 ${WRKSRC}/build/cache/${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}
108 ${LN} -sf ${DISTDIR}/${DIST_SUBDIR}/${RUSTC_BOOTSTRAP} \
109 ${WRKSRC}/build/cache/${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}
110 ${LN} -sf ${DISTDIR}/${DIST_SUBDIR}/${RUST_STD_BOOTSTRAP} \
111 ${WRKSRC}/build/cache/${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}
112 ${LN} -sf ${DISTDIR}/${DIST_SUBDIR}/${CARGO_BOOTSTRAP} \
113 ${WRKSRC}/build/cache/${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}
116 @${REINPLACE_CMD} -e 's|gdb|${LOCALBASE}/bin/gdb|' \
117 ${WRKSRC}/src/etc/rust-gdb
118 # If we override the versions and date of the bootstraps (for instance
119 # on aarch64 where we provide our own bootstraps), we need to update
120 # places where they are recorded.
121 @${REINPLACE_CMD} -e \
122 's|^date:.*|date: ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}|' \
123 ${WRKSRC}/src/stage0.txt
124 @${REINPLACE_CMD} -e \
125 's|^rustc:.*|rustc: ${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}|' \
126 ${WRKSRC}/src/stage0.txt
127 @${REINPLACE_CMD} -e \
128 's|^cargo:.*|cargo: ${CARGO_BOOTSTRAP_VERSION_${ARCH}:U${CARGO_BOOTSTRAP_VERSION}}|' \
129 ${WRKSRC}/src/stage0.txt
130 # Disable vendor checksums
131 @${REINPLACE_CMD} -e \
132 's/"files":{[^}]*}/"files":{}/' \
133 ${CARGO_VENDOR_DIR}/*/.cargo-checksum.json
135 .if defined(WITH_CCACHE_BUILD) && !defined(NO_CCACHE)
136 CCACHE_VALUE= "${CCACHE_WRAPPER_PATH:C,/libexec/ccache$,,}/bin/ccache"
143 ${CARGO_VENDOR_DIR}/backtrace-sys/src/libbacktrace/configure \
144 ${CARGO_VENDOR_DIR}/backtrace-sys/src/libbacktrace/config/libtool.m4; do \
145 mv "$$file" "$$file.dont-fix"; \
150 -e 's,%PREFIX%,${PREFIX},' \
151 -e 's,%SYSCONFDIR%,${PREFIX}/etc,' \
152 -e 's,%MANDIR%,${MANPREFIX}/man,' \
153 -e 's,%PYTHON_CMD%,${PYTHON_CMD},' \
154 -e 's,%CHANNEL%,${RUST_CHANNEL},' \
155 -e 's,%TARGET%,${RUST_TARGET},' \
156 -e 's,%CCACHE%,${CCACHE_VALUE},' \
157 < ${FILESDIR}/config.toml \
158 > ${WRKSRC}/config.toml
162 ${CARGO_VENDOR_DIR}/backtrace-sys/src/libbacktrace/configure \
163 ${CARGO_VENDOR_DIR}/backtrace-sys/src/libbacktrace/config/libtool.m4; do \
164 mv "$$file.dont-fix" "$$file"; \
167 post-configure-DOCS-on:
168 ${REINPLACE_CMD} -e 's,%DOCS%,true,' ${WRKSRC}/config.toml
170 post-configure-DOCS-off:
171 ${REINPLACE_CMD} -e 's,%DOCS%,false,' ${WRKSRC}/config.toml
175 ${SETENV} ${X_PY_ENV} \
178 --config ./config.toml \
179 --jobs ${MAKE_JOBS_NUMBER}
181 # In case the previous "make stage" failed, this ensures rust's
182 # install.sh won't backup previously staged files before reinstalling
183 # new ones. Otherwise, the staging directory is polluted with unneeded
186 @for f in ${RUST_MANIFESTS} ${RUST_DOCS_MANIFEST} ${RUST_SRC_MANIFEST}; do \
187 if test -f "${STAGEDIR}${PREFIX}/$$f"; then \
188 ${SED} -E -e 's,^(file|dir):,${STAGEDIR},' \
189 < "${STAGEDIR}${PREFIX}/$$f" \
190 | ${XARGS} ${RM} -r; \
191 ${RM} "${STAGEDIR}${PREFIX}/$$f"; \
194 @for f in ${PLIST_FILES}; do \
195 ${RM} "${STAGEDIR}${PREFIX}/$$f"; \
200 ${SETENV} ${X_PY_ENV} \
201 DESTDIR=${STAGEDIR} \
202 ${X_PY_CMD} 'install' \
204 --config ./config.toml \
205 --jobs ${MAKE_JOBS_NUMBER}
207 # In post-install, we use the manifests generated during Rust install
208 # to in turn generate the PLIST. We do that, instead of the regular
209 # `pkg-plist`, because several libraries have a computed filename based
210 # on the absolute path of the source files. As it is user-specific, we
211 # can't know their filename in advance.
213 # Both rustc and Cargo components install the same README.md and LICENSE
214 # files. The install process backs up the first copy to install the
215 # second. Thus here, we need to remove those backups. We also need to
216 # dedup the entries in the generated PLIST, because both components'
217 # manifests list them.
219 # We fix manpage entries in the generated manifests because Rust
220 # installs them uncompressed but the Ports framework compresses them.
222 for f in ${RUST_MANIFESTS}; do \
223 ${REINPLACE_CMD} -E \
224 -e 's|:${STAGEDIR}|:|' \
225 -e 's|(man/man[1-9]/.*\.[0-9])|\1.gz|' \
226 ${STAGEDIR}${PREFIX}/$$f; \
227 ${RM} ${STAGEDIR}${PREFIX}/$$f.bak; \
228 ${ECHO_CMD} "${PREFIX}/$$f" >> ${TMPPLIST}; \
232 sub(/^file:/, "", file); \
237 sub(/^dir:/, "", dir); \
238 system("find ${STAGEDIR}" dir " -type f | ${SED} -E -e \"s|${STAGEDIR}||\""); \
240 ${STAGEDIR}${PREFIX}/$$f >> ${TMPPLIST}; \
242 ${RM} ${STAGEDIR}${PREFIX}/share/doc/rust/*.old
243 ${SORT} -u < ${TMPPLIST} > ${TMPPLIST}.uniq
244 ${MV} ${TMPPLIST}.uniq ${TMPPLIST}
246 ${STAGEDIR}${PREFIX}/lib/rustlib/install.log \
247 ${STAGEDIR}${PREFIX}/lib/rustlib/uninstall.sh
248 # FIXME: Static libraries in lib/rustlib/*/lib/*.rlib are not stripped,
249 # but they contain non-object files which make strip(1) unhappy.
251 ${STAGEDIR}${PREFIX}/bin/cargo \
252 ${STAGEDIR}${PREFIX}/bin/cargo-clippy \
253 ${STAGEDIR}${PREFIX}/bin/cargo-fmt \
254 ${STAGEDIR}${PREFIX}/bin/clippy-driver \
255 ${STAGEDIR}${PREFIX}/bin/rls \
256 ${STAGEDIR}${PREFIX}/bin/rustc \
257 ${STAGEDIR}${PREFIX}/bin/rustdoc \
258 ${STAGEDIR}${PREFIX}/bin/rustfmt \
259 ${STAGEDIR}${PREFIX}/lib/*.so \
260 ${STAGEDIR}${PREFIX}/lib/rustlib/*/lib/*.so \
261 ${STAGEDIR}${PREFIX}/lib/rustlib/*/codegen-backends/*.so
263 # We set `extended = true` in config.toml because we want to build
264 # Cargo at the same time. However, this installs the rust-src component
265 # as well. If the user doesn't want that, I don't know how to prevent
266 # its install. So for now, use the rust-src manifest to remove it from
268 post-install-SOURCES-off:
269 if test -f "${STAGEDIR}${PREFIX}/${RUST_SRC_MANIFEST}"; then \
270 ${SED} -E -e 's,^(file|dir):,,' \
271 < "${STAGEDIR}${PREFIX}/${RUST_SRC_MANIFEST}" \
272 | ${XARGS} ${RM} -r; \
273 ${RM} "${STAGEDIR}${PREFIX}/${RUST_SRC_MANIFEST}"; \
274 ${RM} -r "${STAGEDIR}${PREFIX}/lib/rustlib/src"; \
277 # Note that make test does not work when rust is already installed.
280 ${SETENV} ${X_PY_ENV} \
281 ALLOW_NONZERO_RLIMIT_CORE=1 \
284 --config ./config.toml \
285 --jobs ${MAKE_JOBS_NUMBER}
288 ${MAKE} makesum ARCH=${ONLY_FOR_ARCHS:O:[1]}
289 .for arch in ${ONLY_FOR_ARCHS:O:[2..-1]}
290 ${MAKE} makesum ARCH=${arch} DISTINFO_FILE=${DISTINFO_FILE}.${arch}
291 ${GREP} ${RUST_ARCH_${arch}} ${DISTINFO_FILE}.${arch} >> ${DISTINFO_FILE}
292 ${RM} ${DISTINFO_FILE}.${arch}
295 BOOTSTRAPS_SOURCE_PKG_FBSDVER= 10
296 BOOTSTRAPS_SOURCE_PKG_FBSDVER_aarch64= 11
297 BOOTSTRAPS_SOURCE_PKG_REV=
298 BOOTSTRAPS_SOURCE_PKG_URL= https://pkg.freebsd.org/FreeBSD:${BOOTSTRAPS_SOURCE_PKG_FBSDVER_${ARCH}:U${BOOTSTRAPS_SOURCE_PKG_FBSDVER}}:${ARCH}/latest/All/rust-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}${BOOTSTRAPS_SOURCE_PKG_REV}.txz
299 BOOTSTRAPS_SOURCE_PKG= ${_DISTDIR}/${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/rust-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${ARCH}.txz
301 package-to-bootstraps: ${BOOTSTRAPS_SOURCE_PKG}
302 ${MKDIR} ${WRKDIR}/bootstraps
303 ${RM} -r ${WRKDIR}/bootstraps/usr
305 -C ${WRKDIR}/bootstraps \
306 --strip-components 3 \
307 ${EXTRACT_BEFORE_ARGS} ${BOOTSTRAPS_SOURCE_PKG} ${LOCALBASE}
309 ${RM} -r ${WRKDIR}/bootstraps/rustc-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET}
310 ${MKDIR} ${WRKDIR}/bootstraps/rustc-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET}
311 cd ${WRKDIR}/bootstraps/rustc-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET} && \
312 ${MKDIR} rustc/bin rustc/lib && \
313 ${MV} ${WRKDIR}/bootstraps/bin/rust* rustc/bin && \
314 ${MV} ${WRKDIR}/bootstraps/lib/*.so rustc/lib
315 ${TAR} -cz --format=ustar -C ${WRKDIR}/bootstraps \
316 -f ${_DISTDIR}/${RUSTC_BOOTSTRAP} \
317 rustc-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET}
318 # `rust-std` bootstrap.
319 ${RM} -r ${WRKDIR}/bootstraps/rust-std-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET}
320 ${MKDIR} ${WRKDIR}/bootstraps/rust-std-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET}
321 cd ${WRKDIR}/bootstraps/rust-std-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET} && \
322 ${MKDIR} rust-std-${RUST_TARGET}/lib/rustlib/${RUST_TARGET} && \
323 ${MV} ${WRKDIR}/bootstraps/lib/rustlib/${RUST_TARGET}/lib rust-std-${RUST_TARGET}/lib/rustlib/${RUST_TARGET}
324 ${TAR} -cz --format=ustar -C ${WRKDIR}/bootstraps \
325 -f ${_DISTDIR}/${RUST_STD_BOOTSTRAP} \
326 rust-std-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET}
328 ${BOOTSTRAPS_SOURCE_PKG}:
330 ${FETCH_CMD} -o $@ ${BOOTSTRAPS_SOURCE_PKG_URL}
332 .include <bsd.port.post.mk>