Merge branch 'staged'
[dports.git] / lang / rust / Makefile
1 # Created by: Jyun-Yan You <jyyou@cs.nctu.edu.tw>
2 # $FreeBSD$
3
4 PORTNAME=       rust
5 PORTVERSION?=   1.31.1
6 PORTREVISION?=  0
7 CATEGORIES=     lang
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
20 DIST_SUBDIR?=   rust
21 EXTRACT_ONLY?=  ${DISTFILES:N*\:*bootstrap:C/:.*//}
22
23 MAINTAINER=     rust@FreeBSD.org
24 COMMENT=        Language with a focus on memory safety and concurrency
25
26 LICENSE=        APACHE20 \
27                 MIT
28 LICENSE_COMB=   dual
29 LICENSE_FILE_APACHE=    ${WRKSRC}/LICENSE-APACHE
30 LICENSE_FILE_MIT=       ${WRKSRC}/LICENSE-MIT
31
32 BUILD_DEPENDS=          cmake:devel/cmake
33 LIB_DEPENDS=            libcurl.so:ftp/curl \
34                         libgit2.so:devel/libgit2 \
35                         libssh2.so:security/libssh2
36
37 ONLY_FOR_ARCHS?=        aarch64 amd64 i386
38 ONLY_FOR_ARCHS_REASON=  requires prebuilt bootstrap compiler
39
40 BROKEN_aarch64=         fails to build: bootstrap compiler crashes
41
42 CONFLICTS_INSTALL?=     rust-nightly
43
44 # See WRKSRC/src/stage0.txt for this date and version values.
45 BOOTSTRAPS_DATE?=               2018-10-25
46
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
50
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
53
54 CARGO_VENDOR_DIR?=              ${WRKSRC}/src/vendor
55
56 RUST_CHANNEL=   ${PKGNAMESUFFIX:Ustable:S/^-//}
57
58 # Rust's target arch string is different from *BSD arch strings
59 RUST_ARCH_aarch64=      aarch64
60 RUST_ARCH_x86_64=       x86_64
61 RUST_ARCH_i386=         i686
62 RUST_ARCH_x86_64=       x86_64 # dragonfly
63 RUST_TARGET=            ${RUST_ARCH_${ARCH}}-unknown-${OPSYS:tl}
64 PLIST_SUB+=             RUST_TARGET=${RUST_TARGET}
65
66 USES=           compiler gmake libedit pkgconfig python:2.7,build ssl tar:xz
67
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
72
73 GDB_RUN_DEPENDS=                ${LOCALBASE}/bin/gdb:devel/gdb
74 LLNEXTGEN_BUILD_DEPENDS=        LLnextgen:devel/llnextgen
75
76 # Rust manifests list all files and directories installed by rust-installer.
77 # We use them in:
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}
91
92 PLIST_FILES=            lib/rustlib/components \
93                         lib/rustlib/rust-installer-version
94
95 .include <bsd.port.pre.mk>
96
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
102
103 RUST_STD_DIR=   ${RUST_STD_BOOTSTRAP:T:R:R}
104
105 post-extract:
106         @${MKDIR} \
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}}
114
115 post-patch:
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
134
135 .if defined(WITH_CCACHE_BUILD) && !defined(NO_CCACHE)
136 CCACHE_VALUE=   "${CCACHE_WRAPPER_PATH:C,/libexec/ccache$,,}/bin/ccache"
137 .else
138 CCACHE_VALUE=   false
139 .endif
140
141 pre-configure:
142         @for file in \
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"; \
146         done
147
148 do-configure:
149         ${SED} -E \
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
159
160 post-configure:
161         @for file in \
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"; \
165         done
166
167 post-configure-DOCS-on:
168         ${REINPLACE_CMD} -e 's,%DOCS%,true,' ${WRKSRC}/config.toml
169
170 post-configure-DOCS-off:
171         ${REINPLACE_CMD} -e 's,%DOCS%,false,' ${WRKSRC}/config.toml
172
173 do-build:
174         cd ${WRKSRC} && \
175         ${SETENV} ${X_PY_ENV} \
176         ${X_PY_CMD} build \
177                 --verbose \
178                 --config ./config.toml \
179                 --jobs ${MAKE_JOBS_NUMBER}
180
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
184 # files.
185 pre-install:
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"; \
192             fi; \
193         done
194         @for f in ${PLIST_FILES}; do \
195             ${RM} "${STAGEDIR}${PREFIX}/$$f"; \
196         done
197
198 do-install:
199         cd ${WRKSRC} && \
200         ${SETENV} ${X_PY_ENV} \
201                 DESTDIR=${STAGEDIR} \
202         ${X_PY_CMD} 'install' \
203                 --verbose \
204                 --config ./config.toml \
205                 --jobs ${MAKE_JOBS_NUMBER}
206
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.
212 #
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.
218 #
219 # We fix manpage entries in the generated manifests because Rust
220 # installs them uncompressed but the Ports framework compresses them.
221 post-install:
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}; \
229             ${AWK} '\
230                 /^file:/ { \
231                     file=$$0; \
232                     sub(/^file:/, "", file); \
233                     print file; \
234                 } \
235                 /^dir:/ { \
236                     dir=$$0; \
237                     sub(/^dir:/, "", dir); \
238                     system("find ${STAGEDIR}" dir " -type f | ${SED} -E -e \"s|${STAGEDIR}||\""); \
239                 }' \
240                 ${STAGEDIR}${PREFIX}/$$f >> ${TMPPLIST}; \
241         done
242         ${RM} ${STAGEDIR}${PREFIX}/share/doc/rust/*.old
243         ${SORT} -u < ${TMPPLIST} > ${TMPPLIST}.uniq
244         ${MV} ${TMPPLIST}.uniq ${TMPPLIST}
245         @${RM} \
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.
250         @${STRIP_CMD} \
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
262
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
267 # ${STAGEDIR}.
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"; \
275         fi
276
277 # Note that make test does not work when rust is already installed.
278 do-test:
279         cd ${WRKSRC} && \
280         ${SETENV} ${X_PY_ENV} \
281                 ALLOW_NONZERO_RLIMIT_CORE=1 \
282         ${X_PY_CMD} test \
283                 --verbose \
284                 --config ./config.toml \
285                 --jobs ${MAKE_JOBS_NUMBER}
286
287 makesum-all-archs:
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}
293 .endfor
294
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
300
301 package-to-bootstraps: ${BOOTSTRAPS_SOURCE_PKG}
302         ${MKDIR} ${WRKDIR}/bootstraps
303         ${RM} -r ${WRKDIR}/bootstraps/usr
304         ${EXTRACT_CMD} \
305                 -C ${WRKDIR}/bootstraps \
306                 --strip-components 3 \
307                 ${EXTRACT_BEFORE_ARGS} ${BOOTSTRAPS_SOURCE_PKG} ${LOCALBASE}
308 # `rustc` bootstrap.
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}
327
328 ${BOOTSTRAPS_SOURCE_PKG}:
329         ${MKDIR} ${@:H}
330         ${FETCH_CMD} -o $@ ${BOOTSTRAPS_SOURCE_PKG_URL}
331
332 .include <bsd.port.post.mk>