Changeset View
Changeset View
Standalone View
Standalone View
lang/rust/Makefile
# Created by: Jyun-Yan You <jyyou@cs.nctu.edu.tw> | # Created by: Jyun-Yan You <jyyou@cs.nctu.edu.tw> | ||||
# $FreeBSD$ | # $FreeBSD$ | ||||
PORTNAME= rust | PORTNAME= rust | ||||
PORTVERSION?= 1.32.0 | PORTVERSION?= 1.32.0 | ||||
PORTREVISION?= 0 | PORTREVISION?= 0 | ||||
CATEGORIES= lang | CATEGORIES= lang | ||||
MASTER_SITES= http://static.rust-lang.org/dist/:src \ | MASTER_SITES= http://static.rust-lang.org/dist/:src \ | ||||
LOCAL/dumbbell/rust:rust_bootstrap \ | LOCAL/dumbbell/rust:rust_bootstrap \ | ||||
LOCAL/tobik/rust:rust_bootstrap \ | |||||
https://static.rust-lang.org/dist/:rust_bootstrap \ | https://static.rust-lang.org/dist/:rust_bootstrap \ | ||||
LOCAL/dumbbell/rust:cargo_bootstrap \ | LOCAL/dumbbell/rust:cargo_bootstrap \ | ||||
LOCAL/tobik/rust:cargo_bootstrap \ | |||||
https://static.rust-lang.org/dist/:cargo_bootstrap \ | https://static.rust-lang.org/dist/:cargo_bootstrap \ | ||||
https://s3.amazonaws.com/rust-lang-ci/cargo-builds/:cargo_bootstrap \ | https://s3.amazonaws.com/rust-lang-ci/cargo-builds/:cargo_bootstrap \ | ||||
LOCAL/marino:bootstrap | LOCAL/marino:bootstrap | ||||
DISTNAME?= ${PORTNAME}c-${PORTVERSION}-src | DISTNAME?= ${PORTNAME}c-${PORTVERSION}-src | ||||
tobik: Drop that one. It isn't used anywhere. | |||||
DISTFILES?= ${NIGHTLY_SUBDIR}${DISTNAME}${EXTRACT_SUFX}:src \ | DISTFILES?= ${NIGHTLY_SUBDIR}${DISTNAME}${EXTRACT_SUFX}:src \ | ||||
${RUSTC_BOOTSTRAP}:rust_bootstrap \ | ${RUSTC_BOOTSTRAP}:rust_bootstrap \ | ||||
${RUST_STD_BOOTSTRAP}:rust_bootstrap \ | ${RUST_STD_BOOTSTRAP}:rust_bootstrap \ | ||||
${CARGO_BOOTSTRAP}:cargo_bootstrap | ${CARGO_BOOTSTRAP}:cargo_bootstrap | ||||
DIST_SUBDIR?= rust | DIST_SUBDIR?= rust | ||||
EXTRACT_ONLY?= ${DISTFILES:N*\:*bootstrap:C/:.*//} | EXTRACT_ONLY?= ${DISTFILES:N*\:*bootstrap:C/:.*//} | ||||
MAINTAINER= rust@FreeBSD.org | MAINTAINER= rust@FreeBSD.org | ||||
COMMENT= Language with a focus on memory safety and concurrency | COMMENT= Language with a focus on memory safety and concurrency | ||||
LICENSE= APACHE20 \ | LICENSE= APACHE20 \ | ||||
MIT | MIT | ||||
LICENSE_COMB= dual | LICENSE_COMB= dual | ||||
LICENSE_FILE_APACHE= ${WRKSRC}/LICENSE-APACHE | LICENSE_FILE_APACHE= ${WRKSRC}/LICENSE-APACHE | ||||
LICENSE_FILE_MIT= ${WRKSRC}/LICENSE-MIT | LICENSE_FILE_MIT= ${WRKSRC}/LICENSE-MIT | ||||
BUILD_DEPENDS= cmake:devel/cmake | BUILD_DEPENDS= cmake:devel/cmake | ||||
LIB_DEPENDS= libcurl.so:ftp/curl \ | LIB_DEPENDS= libcurl.so:ftp/curl \ | ||||
libgit2.so:devel/libgit2 \ | libgit2.so:devel/libgit2 \ | ||||
libssh2.so:security/libssh2 | libssh2.so:security/libssh2 | ||||
ONLY_FOR_ARCHS?= aarch64 amd64 i386 | ONLY_FOR_ARCHS?= aarch64 amd64 armv6 armv7 i386 powerpc64 | ||||
ONLY_FOR_ARCHS_REASON= requires prebuilt bootstrap compiler | ONLY_FOR_ARCHS_REASON= requires prebuilt bootstrap compiler | ||||
BROKEN_aarch64= fails to build: bootstrap compiler crashes | |||||
CONFLICTS_INSTALL?= rust-nightly | CONFLICTS_INSTALL?= rust-nightly | ||||
# See WRKSRC/src/stage0.txt for this date and version values. | # See WRKSRC/src/stage0.txt for this date and version values. | ||||
BOOTSTRAPS_DATE?= 2018-12-20 | BOOTSTRAPS_DATE?= 2018-12-20 | ||||
RUST_BOOTSTRAP_VERSION?= 1.31.1 | RUST_BOOTSTRAP_VERSION?= 1.31.1 | ||||
RUST_BOOTSTRAP_VERSION_aarch64?= 1.32.0 | |||||
RUST_BOOTSTRAP_VERSION_armv6?= 1.32.0 | |||||
RUST_BOOTSTRAP_VERSION_armv7?= 1.32.0 | |||||
RUST_BOOTSTRAP_VERSION_powerpc64?= 1.32.0 | |||||
RUSTC_BOOTSTRAP= ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/rustc-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET}.tar.gz | RUSTC_BOOTSTRAP= ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/rustc-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET}.tar.gz | ||||
RUST_STD_BOOTSTRAP= ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/rust-std-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET}.tar.gz | RUST_STD_BOOTSTRAP= ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/rust-std-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${RUST_TARGET}.tar.gz | ||||
CARGO_BOOTSTRAP_VERSION?= 0.32.0 | CARGO_BOOTSTRAP_VERSION?= 0.32.0 | ||||
CARGO_BOOTSTRAP_VERSION_aarch64?= 0.33.0 | |||||
CARGO_BOOTSTRAP_VERSION_armv6?= 0.33.0 | |||||
CARGO_BOOTSTRAP_VERSION_armv7?= 0.33.0 | |||||
CARGO_BOOTSTRAP_VERSION_powerpc64?= 0.33.0 | |||||
CARGO_BOOTSTRAP= ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/cargo-${CARGO_BOOTSTRAP_VERSION_${ARCH}:U${CARGO_BOOTSTRAP_VERSION}}-${RUST_TARGET}.tar.gz | CARGO_BOOTSTRAP= ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/cargo-${CARGO_BOOTSTRAP_VERSION_${ARCH}:U${CARGO_BOOTSTRAP_VERSION}}-${RUST_TARGET}.tar.gz | ||||
CARGO_VENDOR_DIR?= ${WRKSRC}/vendor | CARGO_VENDOR_DIR?= ${WRKSRC}/vendor | ||||
RUST_CHANNEL= ${PKGNAMESUFFIX:Ustable:S/^-//} | RUST_CHANNEL= ${PKGNAMESUFFIX:Ustable:S/^-//} | ||||
# Rust's target arch string is different from *BSD arch strings | # Rust's target arch string is different from *BSD arch strings | ||||
RUST_ARCH_aarch64= aarch64 | RUST_ARCH_aarch64= aarch64 | ||||
RUST_ARCH_amd64= x86_64 | RUST_ARCH_amd64= x86_64 | ||||
RUST_ARCH_armv6= armv6 | |||||
RUST_ARCH_armv7= armv7 | |||||
RUST_ARCH_i386= i686 | RUST_ARCH_i386= i686 | ||||
RUST_ARCH_powerpc64= powerpc64 | |||||
RUST_ARCH_x86_64= x86_64 # dragonfly | RUST_ARCH_x86_64= x86_64 # dragonfly | ||||
RUST_TARGET= ${RUST_ARCH_${ARCH}}-unknown-${OPSYS:tl} | RUST_TARGET= ${RUST_ARCH_${ARCH}}-unknown-${OPSYS:tl} | ||||
LLVM_TARGET= ${ARCH:C/armv.*/ARM/:S/aarch64/AArch64/:S/powerpc64/PowerPC/} | |||||
PLIST_SUB+= RUST_TARGET=${RUST_TARGET} | PLIST_SUB+= RUST_TARGET=${RUST_TARGET} | ||||
USES= compiler gmake libedit pkgconfig python:2.7,build ssl tar:xz | USES= compiler gmake libedit pkgconfig python:2.7,build ssl tar:xz | ||||
OPTIONS_DEFINE= DOCS GDB LLNEXTGEN SOURCES | OPTIONS_DEFINE= DOCS GDB LLNEXTGEN SOURCES | ||||
GDB_DESC= Install ports gdb (necessary for debugging rust programs) | GDB_DESC= Install ports gdb (necessary for debugging rust programs) | ||||
LLNEXTGEN_DESC= Build with grammar verification | LLNEXTGEN_DESC= Build with grammar verification | ||||
SOURCES_DESC= Install source files | SOURCES_DESC= Install source files | ||||
GDB_RUN_DEPENDS= ${LOCALBASE}/bin/gdb:devel/gdb | GDB_RUN_DEPENDS= ${LOCALBASE}/bin/gdb:devel/gdb | ||||
LLNEXTGEN_BUILD_DEPENDS= LLnextgen:devel/llnextgen | LLNEXTGEN_BUILD_DEPENDS= LLnextgen:devel/llnextgen | ||||
# Rust manifests list all files and directories installed by rust-installer. | # Rust manifests list all files and directories installed by rust-installer. | ||||
# We use them in: | # We use them in: | ||||
# - pre-install to cleanup the ${STAGEDIR} | # - pre-install to cleanup the ${STAGEDIR} | ||||
# - post-install to populate the ${TMPPLIST} | # - post-install to populate the ${TMPPLIST} | ||||
RUST_MANIFESTS= lib/rustlib/manifest-* | RUST_MANIFESTS= lib/rustlib/manifest-* | ||||
PLIST_FILES= lib/rustlib/components \ | PLIST_FILES= lib/rustlib/components \ | ||||
lib/rustlib/rust-installer-version | lib/rustlib/rust-installer-version | ||||
.include <bsd.port.pre.mk> | .include <bsd.port.pre.mk> | ||||
.if ${ARCH} == powerpc64 | |||||
# The bootstrap is hardcoded to use gcc8 | |||||
# but we can build with a newer or older compiler as provided by USE_GCC=yes | |||||
BUILD_DEPENDS+= gcc8:lang/gcc8 | |||||
Not Done Inline ActionsThese two lines seem to be redundant. tobik: These two lines seem to be redundant. | |||||
Not Done Inline ActionsUSE_GCC=8 ? tobik: USE_GCC=8 ? | |||||
Done Inline ActionsWe can use gcc7 or 8 or X to build lang/rust, only the bootstrap requires gcc8 mikael: We can use gcc7 or 8 or X to build lang/rust, only the bootstrap requires gcc8 | |||||
Not Done Inline ActionsAh, ok. Can you amend the comment with something like "The bootstrap is hardcoded to use gcc8, but we can build with a newer or older compiler as provided by USE_GCC=yes" ? tobik: Ah, ok.
Can you amend the comment with something like "The bootstrap is hardcoded to use gcc8… | |||||
USE_GCC= yes | |||||
.endif | |||||
X_PY_ENV= HOME="${WRKDIR}" \ | X_PY_ENV= HOME="${WRKDIR}" \ | ||||
Not Done Inline ActionsThis patch has x86 and DragonFly specific things in it. This should
tobik: This patch has x86 and DragonFly specific things in it. This should
1. be always applied… | |||||
Done Inline Actionsit's a noop for amd64 and dfly, I'm just moving c_char elsewhere. mikael: it's a noop for amd64 and dfly, I'm just moving c_char elsewhere. | |||||
Not Done Inline ActionsThen it should be no problem to always apply it everywhere. tobik: Then it should be no problem to always apply it everywhere. | |||||
LIBGIT2_SYS_USE_PKG_CONFIG=1 \ | LIBGIT2_SYS_USE_PKG_CONFIG=1 \ | ||||
LIBSSH2_SYS_USE_PKG_CONFIG=1 \ | LIBSSH2_SYS_USE_PKG_CONFIG=1 \ | ||||
OPENSSL_DIR="${OPENSSLBASE}" | OPENSSL_DIR="${OPENSSLBASE}" | ||||
X_PY_CMD= ${PYTHON_CMD} ${WRKSRC}/x.py | X_PY_CMD= ${PYTHON_CMD} ${WRKSRC}/x.py | ||||
RUST_STD_DIR= ${RUST_STD_BOOTSTRAP:T:R:R} | RUST_STD_DIR= ${RUST_STD_BOOTSTRAP:T:R:R} | ||||
post-extract: | post-extract: | ||||
Show All 17 Lines | @${REINPLACE_CMD} -e \ | ||||
's|^date:.*|date: ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}|' \ | 's|^date:.*|date: ${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}|' \ | ||||
${WRKSRC}/src/stage0.txt | ${WRKSRC}/src/stage0.txt | ||||
@${REINPLACE_CMD} -e \ | @${REINPLACE_CMD} -e \ | ||||
's|^rustc:.*|rustc: ${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}|' \ | 's|^rustc:.*|rustc: ${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}|' \ | ||||
${WRKSRC}/src/stage0.txt | ${WRKSRC}/src/stage0.txt | ||||
@${REINPLACE_CMD} -e \ | @${REINPLACE_CMD} -e \ | ||||
's|^cargo:.*|cargo: ${CARGO_BOOTSTRAP_VERSION_${ARCH}:U${CARGO_BOOTSTRAP_VERSION}}|' \ | 's|^cargo:.*|cargo: ${CARGO_BOOTSTRAP_VERSION_${ARCH}:U${CARGO_BOOTSTRAP_VERSION}}|' \ | ||||
${WRKSRC}/src/stage0.txt | ${WRKSRC}/src/stage0.txt | ||||
# Disable vendor checksums | # Disable vendor checksums | ||||
@${REINPLACE_CMD} -e \ | @${REINPLACE_CMD} -e \ | ||||
's/"files":{[^}]*}/"files":{}/' \ | 's/"files":{[^}]*}/"files":{}/' \ | ||||
${CARGO_VENDOR_DIR}/*/.cargo-checksum.json | ${CARGO_VENDOR_DIR}/*/.cargo-checksum.json | ||||
post-patch-SOURCES-off: | post-patch-SOURCES-off: | ||||
# Mimic tools in config.toml with just src excluded | # Mimic tools in config.toml with just src excluded | ||||
@${REINPLACE_CMD} -e 's/config.tools.*"src".*/false;/' \ | @${REINPLACE_CMD} -e 's/config.tools.*"src".*/false;/' \ | ||||
${WRKSRC}/src/bootstrap/install.rs | ${WRKSRC}/src/bootstrap/install.rs | ||||
Not Done Inline ActionsThank you for doing this. We do a similar thing in cargo.mk and I never got around to trying this in lang/rust too. Can you please delete files/patch-src_vendor_openssl-sys_.cargo-checksum.json too? tobik: Thank you for doing this. We do a similar thing in cargo.mk and I never got around to trying… | |||||
.if defined(WITH_CCACHE_BUILD) && !defined(NO_CCACHE) | .if defined(WITH_CCACHE_BUILD) && !defined(NO_CCACHE) | ||||
CCACHE_VALUE= "${CCACHE_WRAPPER_PATH:C,/libexec/ccache$,,}/bin/ccache" | CCACHE_VALUE= "${CCACHE_WRAPPER_PATH:C,/libexec/ccache$,,}/bin/ccache" | ||||
.else | .else | ||||
CCACHE_VALUE= false | CCACHE_VALUE= false | ||||
.endif | .endif | ||||
pre-configure: | pre-configure: | ||||
@for file in \ | @for file in \ | ||||
${CARGO_VENDOR_DIR}/backtrace-sys/src/libbacktrace/configure \ | ${CARGO_VENDOR_DIR}/backtrace-sys/src/libbacktrace/configure \ | ||||
${CARGO_VENDOR_DIR}/backtrace-sys/src/libbacktrace/config/libtool.m4; do \ | ${CARGO_VENDOR_DIR}/backtrace-sys/src/libbacktrace/config/libtool.m4; do \ | ||||
mv "$$file" "$$file.dont-fix"; \ | mv "$$file" "$$file.dont-fix"; \ | ||||
done | done | ||||
do-configure: | do-configure: | ||||
${SED} -E \ | ${SED} -E \ | ||||
-e 's,%PREFIX%,${PREFIX},' \ | -e 's,%PREFIX%,${PREFIX},' \ | ||||
-e 's,%SYSCONFDIR%,${PREFIX}/etc,' \ | -e 's,%SYSCONFDIR%,${PREFIX}/etc,' \ | ||||
-e 's,%MANDIR%,${MANPREFIX}/man,' \ | -e 's,%MANDIR%,${MANPREFIX}/man,' \ | ||||
-e 's,%PYTHON_CMD%,${PYTHON_CMD},' \ | -e 's,%PYTHON_CMD%,${PYTHON_CMD},' \ | ||||
-e 's,%CHANNEL%,${RUST_CHANNEL},' \ | -e 's,%CHANNEL%,${RUST_CHANNEL},' \ | ||||
-e 's,%TARGET%,${RUST_TARGET},' \ | -e 's,%TARGET%,${RUST_TARGET},' \ | ||||
-e 's,%CCACHE%,${CCACHE_VALUE},' \ | -e 's,%CCACHE%,${CCACHE_VALUE},' \ | ||||
-e 's,%CC%,${CC},' \ | |||||
-e 's,%CXX%,${CXX},' \ | |||||
< ${FILESDIR}/config.toml \ | < ${FILESDIR}/config.toml \ | ||||
> ${WRKSRC}/config.toml | > ${WRKSRC}/config.toml | ||||
# no need to build a crosscompiler for these targets | |||||
.if ${ARCH} == aarch64 || ${ARCH} == armv6 || ${ARCH} == armv7 || ${ARCH} == powerpc64 | |||||
@${REINPLACE_CMD} -e 's,^#targets =.*,targets = "${LLVM_TARGET}",' \ | |||||
-e 's,^#experimental-targets =.*,experimental-targets = "",' \ | |||||
${WRKSRC}/config.toml | |||||
.endif | |||||
@${REINPLACE_CMD} -e 's,%CC%,${CC},g' \ | |||||
${WRKSRC}/src/librustc_llvm/build.rs \ | |||||
${WRKSRC}/src/bootstrap/native.rs | |||||
post-configure: | post-configure: | ||||
@for file in \ | @for file in \ | ||||
${CARGO_VENDOR_DIR}/backtrace-sys/src/libbacktrace/configure \ | ${CARGO_VENDOR_DIR}/backtrace-sys/src/libbacktrace/configure \ | ||||
${CARGO_VENDOR_DIR}/backtrace-sys/src/libbacktrace/config/libtool.m4; do \ | ${CARGO_VENDOR_DIR}/backtrace-sys/src/libbacktrace/config/libtool.m4; do \ | ||||
mv "$$file.dont-fix" "$$file"; \ | mv "$$file.dont-fix" "$$file"; \ | ||||
done | done | ||||
post-configure-DOCS-on: | post-configure-DOCS-on: | ||||
▲ Show 20 Lines • Show All 96 Lines • ▼ Show 20 Lines | |||||
.for arch in ${ONLY_FOR_ARCHS:O:[2..-1]} | .for arch in ${ONLY_FOR_ARCHS:O:[2..-1]} | ||||
${MAKE} makesum ARCH=${arch} DISTINFO_FILE=${DISTINFO_FILE}.${arch} | ${MAKE} makesum ARCH=${arch} DISTINFO_FILE=${DISTINFO_FILE}.${arch} | ||||
${GREP} ${RUST_ARCH_${arch}} ${DISTINFO_FILE}.${arch} >> ${DISTINFO_FILE} | ${GREP} ${RUST_ARCH_${arch}} ${DISTINFO_FILE}.${arch} >> ${DISTINFO_FILE} | ||||
${RM} ${DISTINFO_FILE}.${arch} | ${RM} ${DISTINFO_FILE}.${arch} | ||||
.endfor | .endfor | ||||
BOOTSTRAPS_SOURCE_PKG_FBSDVER= 10 | BOOTSTRAPS_SOURCE_PKG_FBSDVER= 10 | ||||
BOOTSTRAPS_SOURCE_PKG_FBSDVER_aarch64= 11 | BOOTSTRAPS_SOURCE_PKG_FBSDVER_aarch64= 11 | ||||
BOOTSTRAPS_SOURCE_PKG_FBSDVER_armv6= 11 | |||||
BOOTSTRAPS_SOURCE_PKG_FBSDVER_armv7= 12 | |||||
BOOTSTRAPS_SOURCE_PKG_FBSDVER_powerpc64= 11 | |||||
BOOTSTRAPS_SOURCE_PKG_REV= | BOOTSTRAPS_SOURCE_PKG_REV= | ||||
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 | 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 | ||||
BOOTSTRAPS_SOURCE_PKG= ${_DISTDIR}/${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/rust-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${ARCH}.txz | BOOTSTRAPS_SOURCE_PKG= ${_DISTDIR}/${BOOTSTRAPS_DATE_${ARCH}:U${BOOTSTRAPS_DATE}}/rust-${RUST_BOOTSTRAP_VERSION_${ARCH}:U${RUST_BOOTSTRAP_VERSION}}-${ARCH}.txz | ||||
package-to-bootstraps: ${BOOTSTRAPS_SOURCE_PKG} | package-to-bootstraps: ${BOOTSTRAPS_SOURCE_PKG} | ||||
${MKDIR} ${WRKDIR}/bootstraps | ${MKDIR} ${WRKDIR}/bootstraps | ||||
${RM} -r ${WRKDIR}/bootstraps/usr | ${RM} -r ${WRKDIR}/bootstraps/usr | ||||
${EXTRACT_CMD} \ | ${EXTRACT_CMD} \ | ||||
Show All 28 Lines |
Drop that one. It isn't used anywhere.