Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F152782285
D11162.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
D11162.diff
View Options
Index: head/Mk/Scripts/cargo-crates.awk
===================================================================
--- head/Mk/Scripts/cargo-crates.awk
+++ head/Mk/Scripts/cargo-crates.awk
@@ -0,0 +1,56 @@
+BEGIN {
+ gh_tuple_len = 0
+ crates_len = 0
+ package_name = "<unknown>"
+}
+
+/^"checksum .* .* \(registry\+.*\)" = ".*"/ {
+ # $2: crate
+ # $3: version
+ # $4: url
+ # $6: checksum
+ crates[crates_len++] = sprintf("%s-%s", $2, $3)
+}
+
+/^name = ".*"/ {
+ package_name = $3
+ gsub("[^a-zA-Z_]", "", package_name)
+}
+
+/^source = "git\+(https|http|git):\/\/github.com\/.*#.*"/ {
+ split($3, url, "#")
+
+ gsub("^\"git\+", "", url[1])
+ split(url[1], repourl, "/")
+ account = repourl[4]
+ project = repourl[5]
+ gsub("\.git$", "", project)
+
+ tag = url[2]
+ gsub("\"$", "", tag)
+
+ gh_tuple[gh_tuple_len++] = sprintf(\
+ "%s:%s:%s:%s", account, project, tag, package_name)
+}
+
+function print_array(start, arr, arrlen) {
+ end = " \\\n"
+ for (i = 0; i < arrlen; i++) {
+ if (i == arrlen - 1) {
+ end = "\n"
+ }
+ printf "%s\t%s%s", start, arr[i], end
+ start = "\t"
+ }
+}
+
+END {
+ if (gh_tuple_len > 0 && ENVIRON["USE_GITHUB"] == "") {
+ printf "USE_GITHUB=\tnodefault\n"
+ }
+ print_array("GH_TUPLE=", gh_tuple, gh_tuple_len)
+ print_array("CARGO_CRATES=", crates, crates_len)
+ if (gh_tuple_len > 0) {
+ printf "CARGO_USE_GITHUB=\tyes\n"
+ }
+}
Index: head/Mk/Uses/cargo.mk
===================================================================
--- head/Mk/Uses/cargo.mk
+++ head/Mk/Uses/cargo.mk
@@ -0,0 +1,219 @@
+# $FreeBSD$
+#
+# This file contains logic to ease porting of Rust packages or
+# binaries using the `cargo` command.
+#
+# Feature: cargo
+# Usage: USES=cargo
+# Valid ARGS: none
+#
+# MAINTAINER: ports@FreeBSD.org
+
+.if !defined(_INCLUDE_USES_CARGO_MK)
+_INCLUDE_USES_CARGO_MK= yes
+
+.if !empty(cargo_ARGS)
+IGNORE+= USES=cargo takes no arguments
+.endif
+
+# List of static dependencies. The format is cratename-version.
+# CARGO_CRATES will be downloaded from MASTER_SITES_CRATESIO.
+CARGO_CRATES?=
+
+# List of features to build (space separated list).
+CARGO_FEATURES?=
+
+# Name of the local directory for vendoring crates.
+CARGO_VENDOR_DIR?= ${WRKSRC}/cargo-crates
+
+# Default path for cargo manifest.
+CARGO_CARGOTOML?= ${WRKSRC}/Cargo.toml
+CARGO_CARGOLOCK?= ${WRKSRC}/Cargo.lock
+
+# Define MASTER_SITES_CRATESIO for crates.io
+MASTER_SITES_CRATESIO= https://crates.io/api/v1/crates
+
+# Save crates inside ${DISTDIR}/rust/crates by default.
+CARGO_DIST_SUBDIR?= rust/crates
+
+# Generate list of DISTFILES.
+.for _crate in ${CARGO_CRATES}
+MASTER_SITES+= ${MASTER_SITES_CRATESIO}/${_crate:C/-[^-]*$//}/${_crate:C/^.*-//}/download?dummy=/:cargo_${_crate:S/-//g:S/.//g}
+DISTFILES+= ${CARGO_DIST_SUBDIR}/${_crate}.tar.gz:cargo_${_crate:S/-//g:S/.//g}
+.endfor
+
+# Build dependencies.
+
+CARGO_BUILDDEP?= yes
+.if ${CARGO_BUILDDEP:tl} == "yes"
+BUILD_DEPENDS+= cargo:devel/cargo rustc:lang/rust
+.endif
+
+# Location of cargo binary (default to devel/cargo binary)
+CARGO_CARGO_BIN?= ${LOCALBASE}/bin/cargo
+
+# Location of the cargo output directory.
+CARGO_TARGET_DIR?= ${WRKDIR}/target
+
+# Environment for cargo
+# - CARGO_HOME: local cache of the registry index
+# - CARGO_BUILD_JOBS: configure number of jobs to run
+# - CARGO_TARGET_DIR: location of where to place all generated artifacts
+# - RUSTC: path of rustc binary (default to lang/rust)
+# - RUSTDOC: path of rustdoc binary (default to lang/rust)
+# - RUSTFLAGS: custom flags to pass to all compiler invocations that Cargo performs
+#
+# XXX LDFLAGS => -C link-arg=$1 (via RUSTFLAGS)
+CARGO_ENV+= \
+ CARGO_HOME=${WRKDIR}/cargo-home \
+ CARGO_BUILD_JOBS=${MAKE_JOBS_NUMBER} \
+ CARGO_TARGET_DIR=${CARGO_TARGET_DIR} \
+ RUSTC=${LOCALBASE}/bin/rustc \
+ RUSTDOC=${LOCALBASE}/bin/rustdoc \
+ RUSTFLAGS="${RUSTFLAGS}"
+
+# Helper to shorten cargo calls.
+CARGO_CARGO_RUN= \
+ cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} ${CARGO_ENV} \
+ ${CARGO_CARGO_BIN}
+
+# User arguments for cargo targets.
+CARGO_BUILD_ARGS?=
+CARGO_INSTALL_ARGS?=
+CARGO_TEST_ARGS?=
+CARGO_UPDATE_ARGS?=
+
+# Use module targets ?
+CARGO_BUILD?= yes
+CARGO_CONFIGURE?= yes
+CARGO_INSTALL?= yes
+CARGO_TEST?= yes
+CARGO_USE_GITHUB?= no
+
+# If your application has multiple Cargo.toml files which all use
+# git-sourced dependencies and require the use of CARGO_USE_GITHUB and
+# GH_TUPLE, then you add them to CARGO_GH_CARGOTOML to also point them
+# to the correct offline sources.
+CARGO_GH_CARGOTOML?= ${CARGO_CARGOTOML}
+
+# Manage crate features.
+.if !empty(CARGO_FEATURES)
+CARGO_BUILD_ARGS+= --features='${CARGO_FEATURES}'
+CARGO_INSTALL_ARGS+= --features='${CARGO_FEATURES}'
+CARGO_TEST_ARGS+= --features='${CARGO_FEATURES}'
+.endif
+
+.if !defined(WITH_DEBUG) || defined(WITHOUT_DEBUG)
+CARGO_BUILD_ARGS+= --release
+CARGO_TEST_ARGS+= --release
+.else
+CARGO_INSTALL_ARGS+= --debug
+.endif
+
+.if ${CARGO_CRATES:Mlibgit2-sys-*}
+# Use the system's libgit2 instead of building the bundled version
+LIB_DEPENDS+= libgit2.so:devel/libgit2
+CARGO_ENV+= LIBGIT2_SYS_USE_PKG_CONFIG=1
+.endif
+
+.if ${CARGO_CRATES:Mopenssl-sys-*}
+# Make sure that openssl-sys can find the correct version of OpenSSL
+.include "${USESDIR}/ssl.mk"
+CARGO_ENV+= OPENSSL_LIB_DIR=${OPENSSLLIB} \
+ OPENSSL_INCLUDE_DIR=${OPENSSLINC}
+.endif
+
+.if ${CARGO_CRATES:Mpkg-config-*}
+.include "${USESDIR}/pkgconfig.mk"
+.endif
+
+_USES_extract+= 600:cargo-extract
+cargo-extract:
+# target for preparing crates directory. It will put all crates in
+# the local crates directory.
+ @${ECHO_MSG} "===> Moving crates to ${CARGO_VENDOR_DIR}"
+ @${MKDIR} ${CARGO_VENDOR_DIR}
+.for _crate in ${CARGO_CRATES}
+ @${MV} ${WRKDIR}/${_crate} ${CARGO_VENDOR_DIR}/${_crate}
+ @${PRINTF} '{"package":"%s","files":{}}' \
+ $$(${SHA256} -q ${DISTDIR}/${CARGO_DIST_SUBDIR}/${_crate}.tar.gz) \
+ > ${CARGO_VENDOR_DIR}/${_crate}/.cargo-checksum.json
+.endfor
+
+.if ${CARGO_USE_GITHUB:tl} == "yes"
+_USES_patch+= 600:cargo-patch-github
+
+.for _group in ${GH_TUPLE:C@^[^:]*:[^:]*:[^:]*:(([^:/]*)?)((/.*)?)@\2@}
+_CARGO_GH_PATCH_CARGOTOML:= ${_CARGO_GH_PATCH_CARGOTOML} \
+ -e 's@git = "(https|http|git)://github.com/${GH_ACCOUNT_${_group}}/${GH_PROJECT_${_group}}(\.git)?"@path = "${WRKSRC_${_group}}"@'
+.endfor
+
+cargo-patch-github:
+ @${SED} -i.dist -E ${_CARGO_GH_PATCH_CARGOTOML} ${CARGO_GH_CARGOTOML}
+.endif
+
+.if !target(do-configure) && ${CARGO_CONFIGURE:tl} == "yes"
+# configure hook. Place a config file for overriding crates-io index
+# by local source directory.
+do-configure:
+ @${MKDIR} ${WRKDIR}/.cargo
+ @${ECHO_CMD} "[source.cargo]" > ${WRKDIR}/.cargo/config
+ @${ECHO_CMD} "directory = '${CARGO_VENDOR_DIR}'" >> ${WRKDIR}/.cargo/config
+ @${ECHO_CMD} "[source.crates-io]" >> ${WRKDIR}/.cargo/config
+ @${ECHO_CMD} "replace-with = 'cargo'" >> ${WRKDIR}/.cargo/config
+ @if ! ${GREP} -qF '[profile.release]' ${CARGO_CARGOTOML}; then \
+ ${ECHO_CMD} "" >> ${CARGO_CARGOTOML}; \
+ ${ECHO_CMD} "[profile.release]" >> ${CARGO_CARGOTOML}; \
+ ${ECHO_CMD} "opt-level = 2" >> ${CARGO_CARGOTOML}; \
+ ${ECHO_CMD} "debug = false" >> ${CARGO_CARGOTOML}; \
+ fi
+ @${CARGO_CARGO_RUN} update \
+ --manifest-path ${CARGO_CARGOTOML} \
+ --verbose \
+ ${CARGO_UPDATE_ARGS}
+.endif
+
+.if !target(do-build) && ${CARGO_BUILD:tl} == "yes"
+do-build:
+ @${CARGO_CARGO_RUN} build \
+ --manifest-path ${CARGO_CARGOTOML} \
+ --verbose \
+ ${CARGO_BUILD_ARGS}
+.endif
+
+.if !target(do-install) && ${CARGO_INSTALL:tl} == "yes"
+do-install:
+ @${CARGO_CARGO_RUN} install \
+ --root "${STAGEDIR}${PREFIX}" \
+ --verbose \
+ ${CARGO_INSTALL_ARGS}
+ @${RM} -- "${STAGEDIR}${PREFIX}/.crates.toml"
+.endif
+
+.if !target(do-test) && ${CARGO_TEST:tl} == "yes"
+do-test:
+ @${CARGO_CARGO_RUN} test \
+ --manifest-path ${CARGO_CARGOTOML} \
+ --verbose \
+ ${CARGO_TEST_ARGS}
+.endif
+
+#
+# Helper targets for port maintainers
+#
+
+# cargo-crates will output the crates list from Cargo.lock.
+cargo-crates: extract
+ @${SETENV} USE_GITHUB=${USE_GITHUB} \
+ ${AWK} -f ${SCRIPTSDIR}/cargo-crates.awk ${CARGO_CARGOLOCK}
+
+# cargo-crates-licenses will try to grab license information from
+# all downloaded crates.
+cargo-crates-licenses: configure
+ @${FIND} ${CARGO_VENDOR_DIR} -name 'Cargo.toml' -maxdepth 2 \
+ -exec ${GREP} -H '^license' {} \; \
+ | ${SED} \
+ -e 's@^${CARGO_VENDOR_DIR}/@@' \
+ -e 's@/Cargo.toml:license.*= *"@|@' \
+ -e 's@"$$@@g' | /usr/bin/column -t -s '|'
+.endif
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Apr 18, 2:04 AM (4 h, 43 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31691717
Default Alt Text
D11162.diff (8 KB)
Attached To
Mode
D11162: Mk/Uses/cargo.mk: Add support for porting Rust applications to the ports framework
Attached
Detach File
Event Timeline
Log In to Comment