diff --git a/Config.in b/Config.in index bdf5fa8647..e0257ba3e8 100644 --- a/Config.in +++ b/Config.in @@ -103,6 +103,10 @@ menu "Build options" menu "Commands" +config BR2_CURL + string "Curl command" + default "curl -q --ftp-pasv --retry 3" + config BR2_WGET string "Wget command" default "wget -nd -t 3" diff --git a/docs/manual/prerequisite.adoc b/docs/manual/prerequisite.adoc index ab609c12be..5d3aa297a9 100644 --- a/docs/manual/prerequisite.adoc +++ b/docs/manual/prerequisite.adoc @@ -75,6 +75,7 @@ packages using any of these methods, you will need to install the corresponding tool on the host system: + ** +bazaar+ +** +curl+ ** +cvs+ ** +git+ ** +mercurial+ diff --git a/package/pkg-download.mk b/package/pkg-download.mk index 7028d3917a..17c8a244c4 100644 --- a/package/pkg-download.mk +++ b/package/pkg-download.mk @@ -8,6 +8,7 @@ ################################################################################ # Download method commands +export CURL := $(call qstrip,$(BR2_CURL)) export WGET := $(call qstrip,$(BR2_WGET)) export SVN := $(call qstrip,$(BR2_SVN)) export CVS := $(call qstrip,$(BR2_CVS)) diff --git a/package/pkg-generic.mk b/package/pkg-generic.mk index a2749320c3..e1c16b7343 100644 --- a/package/pkg-generic.mk +++ b/package/pkg-generic.mk @@ -1253,6 +1253,8 @@ else ifeq ($$($(2)_SITE_METHOD),hg) DL_TOOLS_DEPENDENCIES += hg else ifeq ($$($(2)_SITE_METHOD),cvs) DL_TOOLS_DEPENDENCIES += cvs +else ifneq ($(filter ftp ftps,$$($(2)_SITE_METHOD)),) +DL_TOOLS_DEPENDENCIES += curl endif # SITE_METHOD # cargo/go vendoring (may) need git diff --git a/support/download/curl b/support/download/curl new file mode 100755 index 0000000000..bea4485a6c --- /dev/null +++ b/support/download/curl @@ -0,0 +1,45 @@ +#!/usr/bin/env bash + +# We want to catch any unexpected failure, and exit immediately +set -e + +# Download helper for curl, to be called from the download wrapper script +# +# Options: +# -q Be quiet. +# -o FILE Save into file FILE. +# -f FILENAME The filename of the tarball to get at URL +# -u URL Download file at URL. +# +# Environment: +# CURL : the curl command to call + +quiet= +while getopts "${BR_BACKEND_DL_GETOPTS}" OPT; do + case "${OPT}" in + q) quiet=-s;; + o) output="${OPTARG}";; + f) filename="${OPTARG}";; + u) url="${OPTARG}";; + :) printf "option '%s' expects a mandatory argument\n" "${OPTARG}"; exit 1;; + \?) printf "unknown option '%s'\n" "${OPTARG}" >&2; exit 1;; + esac +done + +shift $((OPTIND-1)) # Get rid of our options + +# Caller needs to single-quote its arguments to prevent them from +# being expanded a second time (in case there are spaces in them) +_curl() { + if [ -z "${quiet}" ]; then + printf '%s ' "${CURL}" "${@}"; printf '\n' + fi + _plain_curl "$@" +} +# Note: please keep command below aligned with what is printed above +_plain_curl() { + # shellcheck disable=SC2086 # We want splitting + eval ${CURL} "${@}" +} + +_curl ${quiet} "${@}" --output "'${output}'" "'${url}/${filename}'" diff --git a/support/download/dl-wrapper b/support/download/dl-wrapper index 35428faeef..069b2c1c21 100755 --- a/support/download/dl-wrapper +++ b/support/download/dl-wrapper @@ -91,6 +91,7 @@ main() { backend="${backend_urlencode%|*}" case "${backend}" in git|svn|cvs|bzr|file|scp|hg|sftp) ;; + ftp|ftps) backend="curl" ;; *) backend="wget" ;; esac uri=${uri#*+}