simple src_configure implementation inspired by cmake.eclass

Closes: https://bugs.gentoo.org/721936

Signed-off-by: Georgy Yakovlev <gyakov...@gentoo.org>
---
 eclass/cargo.eclass | 51 ++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 44 insertions(+), 7 deletions(-)

diff --git a/eclass/cargo.eclass b/eclass/cargo.eclass
index ad90a0c7dd8..b084e082730 100644
--- a/eclass/cargo.eclass
+++ b/eclass/cargo.eclass
@@ -23,7 +23,7 @@ esac
 
 inherit multiprocessing toolchain-funcs
 
-EXPORT_FUNCTIONS src_unpack src_compile src_install src_test
+EXPORT_FUNCTIONS src_unpack src_configure src_compile src_install src_test
 
 IUSE="${IUSE} debug"
 
@@ -35,6 +35,24 @@ ECARGO_VENDOR="${ECARGO_HOME}/gentoo"
 # Allows overriding the default cwd to run cargo install from
 : ${CARGO_INSTALL_PATH:=.}
 
+# @VARIABLE: myfeatures
+# @DEFAULT_UNSET
+# @DESCRIPTION:
+# Optional cargo features defined as bash array. Should be defined before 
calling
+# src_configure.
+# Example for package that has x11 and wayland as features.
+# Also disables default features, as optional parameter is passed.
+# @CODE
+# src_configure() {
+#      local myfeatures=(
+#              $(usex X x11 '')
+#              $(usev wayland)
+#      )
+#
+#      cargo_src_configure --no-default-features
+# }
+# @CODE
+
 # @FUNCTION: cargo_crate_uris
 # @DESCRIPTION:
 # Generates the URIs to put in SRC_URI to help fetch dependencies.
@@ -113,6 +131,7 @@ cargo_live_src_unpack() {
        mkdir -p "${S}" || die
 
        pushd "${S}" > /dev/null || die
+       # need to specify CARGO_HOME before cargo_gen_config fired
        CARGO_HOME="${ECARGO_HOME}" cargo fetch || die
        CARGO_HOME="${ECARGO_HOME}" cargo vendor "${ECARGO_VENDOR}" || die
        popd > /dev/null || die
@@ -152,6 +171,26 @@ cargo_gen_config() {
        EOF
        # honor NOCOLOR setting
        [[ "${NOCOLOR}" = true || "${NOCOLOR}" = yes ]] && echo "color = 
'never'" >> "${ECARGO_HOME}/config"
+
+       export CARGO_HOME="${ECARGO_HOME}"
+}
+
+# @FUNCTION: cargo_src_configure
+# @DESCRIPTION:
+# Configure cargo package features
+cargo_src_configure() {
+       debug-print-function ${FUNCNAME} "$@"
+
+       [[ -z ${myfeatures} ]] && declare -a myfeatures=()
+       local myfeaturestype=$(declare -p myfeatures 2>&-)
+       if [[ "${myfeaturestype}" != "declare -a myfeatures="* ]]; then
+               die "myfeatures must be declared as array"
+       fi
+
+       # transform array from simple feature list
+       # to multiple cargo args:
+       # --features feature1 --features feature2 ...
+       readonly ECARGO_FEATURES=( ${myfeatures[@]/#/--features } )
 }
 
 # @FUNCTION: cargo_src_compile
@@ -160,11 +199,9 @@ cargo_gen_config() {
 cargo_src_compile() {
        debug-print-function ${FUNCNAME} "$@"
 
-       export CARGO_HOME="${ECARGO_HOME}"
-
        tc-export AR CC
 
-       cargo build $(usex debug "" --release) "$@" \
+       cargo build $(usex debug "" --release) ${ECARGO_FEATURES[@]} "$@" \
                || die "cargo build failed"
 }
 
@@ -174,8 +211,8 @@ cargo_src_compile() {
 cargo_src_install() {
        debug-print-function ${FUNCNAME} "$@"
 
-       cargo install --path ${CARGO_INSTALL_PATH} \
-               --root="${ED}/usr" $(usex debug --debug "") "$@" \
+       cargo install --path ${CARGO_INSTALL_PATH} --root="${ED}/usr" \
+               $(usex debug --debug "") ${ECARGO_FEATURES[@]} "$@" \
                || die "cargo install failed"
        rm -f "${ED}/usr/.crates.toml"
        rm -f "${ED}/usr/.crates2.json"
@@ -189,7 +226,7 @@ cargo_src_install() {
 cargo_src_test() {
        debug-print-function ${FUNCNAME} "$@"
 
-       cargo test $(usex debug "" --release) "$@" \
+       cargo test $(usex debug "" --release) ${ECARGO_FEATURES[@]} "$@" \
                || die "cargo test failed"
 }
 
-- 
2.27.0


Reply via email to