Hi Andrew,
On 4/9/24 16:12, Andrew Pinski wrote:
On Mon, Apr 8, 2024 at 9:39 AM <pierre-emmanuel.pa...@embecosm.com> wrote:
From: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>
Hello,
The rust frontend requires cargo to build some of it's components,
it's presence was not checked during configuration.
NOTE cargo itself is a huge security hole. If anything we should place
all of the required dependencies with the specific versions that has
been tested on gcc.gnu.org (with md5 sums) and download that instead
of depending on some random downloads via cargo. Talk about broken
supply chain when things are downloading things randomly off the
internet.
There is no need to download things randomly off the internet in order
to work with cargo. We have a commit being reviewed which vendors our
format parser's two dependencies (libc and unicode functions), and makes
it so that cargo builds our components with the --offline flag for no
internet access. This will be upstreamed soon.
This was a simple one line command and it has been tested on containers
without internet access.
If there is a way to cache and use those specific versions using
cargo, that should be done but I suspect cargo does not work that way.
As we talked about yesterday on IRC, cargo does work that way. Sorry if
I was unclear.
Also any time someone says this is a temporary measure it is NOT and
we should never treat it as such unless you already have a patch to
remove it.
When the time comes we will be more than happy to remove our dependency
on rustc in order to compiler our dependencies with our own Rust
front-end. It is one of my objectives, and we're working hard towards
making that possible :)
Respectfully,
Arthur
Thanks,
Andrew Pinski
Best regards,
Pierre-Emmanuel
----------
Prevent rust language from building when cargo is
missing.
config/ChangeLog:
* acx.m4: Add a macro to check for rust
components.
ChangeLog:
* configure: Regenerate.
* configure.ac: Emit an error message when cargo
is missing.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.pa...@embecosm.com>
---
config/acx.m4 | 11 +++++
configure | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++
configure.ac | 18 ++++++++
3 files changed, 146 insertions(+)
diff --git a/config/acx.m4 b/config/acx.m4
index 7efe98aaf96..3c5fe67342e 100644
--- a/config/acx.m4
+++ b/config/acx.m4
@@ -424,6 +424,17 @@ else
fi
])
+# Test for Rust
+# We require cargo and rustc for some parts of the rust compiler.
+AC_DEFUN([ACX_PROG_CARGO],
+[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])
+AC_CHECK_TOOL(CARGO, cargo, no)
+if test "x$CARGO" != xno; then
+ have_cargo=yes
+else
+ have_cargo=no
+fi])
+
# Test for D.
AC_DEFUN([ACX_PROG_GDC],
[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])
diff --git a/configure b/configure
index 874966fb9f0..46e66e20197 100755
--- a/configure
+++ b/configure
@@ -714,6 +714,7 @@ PGO_BUILD_GEN_CFLAGS
HAVE_CXX11_FOR_BUILD
HAVE_CXX11
do_compare
+CARGO
GDC
GNATMAKE
GNATBIND
@@ -5786,6 +5787,104 @@ else
have_gdc=no
fi
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cargo", so it can be a program
name with args.
+set dummy ${ac_tool_prefix}cargo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CARGO+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$CARGO"; then
+ ac_cv_prog_CARGO="$CARGO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CARGO="${ac_tool_prefix}cargo"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CARGO=$ac_cv_prog_CARGO
+if test -n "$CARGO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CARGO" >&5
+$as_echo "$CARGO" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CARGO"; then
+ ac_ct_CARGO=$CARGO
+ # Extract the first word of "cargo", so it can be a program name with args.
+set dummy cargo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CARGO+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -n "$ac_ct_CARGO"; then
+ ac_cv_prog_ac_ct_CARGO="$ac_ct_CARGO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CARGO="cargo"
+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext"
>&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CARGO=$ac_cv_prog_ac_ct_CARGO
+if test -n "$ac_ct_CARGO"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CARGO" >&5
+$as_echo "$ac_ct_CARGO" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+ if test "x$ac_ct_CARGO" = x; then
+ CARGO="no"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host
triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet"
>&2;}
+ac_tool_warned=yes ;;
+esac
+ CARGO=$ac_ct_CARGO
+ fi
+else
+ CARGO="$ac_cv_prog_CARGO"
+fi
+
+if test "x$CARGO" != xno; then
+ have_cargo=yes
+else
+ have_cargo=no
+fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to compare bootstrapped
objects" >&5
$as_echo_n "checking how to compare bootstrapped objects... " >&6; }
if ${gcc_cv_prog_cmp_skip+:} false; then :
@@ -9099,6 +9198,24 @@ $as_echo "$as_me: WARNING: --enable-host-shared required to build
$language" >&2
;;
esac
+ # Disable Rust if cargo is unavailable.
+ case ${add_this_lang}:${language}:${have_cargo} in
+ yes:rust:no)
+ # Specifically requested language; tell them.
+ as_fn_error $? "cargo is required to build $language" "$LINENO" 5
+ ;;
+ all:rust:no)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cargo is required to build
$language" >&5
+$as_echo "$as_me: WARNING: cargo is required to build $language" >&2;}
+ add_this_lang=unsupported
+ ;;
+ *:rust:no)
+ # Silently disable.
+ add_this_lang=unsupported
+ ;;
+ esac
+
+
# Disable a language that is unsupported by the target.
case "${add_this_lang}: $unsupported_languages " in
no:*) ;;
diff --git a/configure.ac b/configure.ac
index 4f34004a072..8c33c89d02c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1411,6 +1411,7 @@ fi
ACX_PROG_GNAT
ACX_PROG_GDC
+ACX_PROG_CARGO
ACX_PROG_CMP_IGNORE_INITIAL
AC_ARG_ENABLE([bootstrap],
@@ -2305,6 +2306,23 @@ directories, to avoid imposing the performance cost of
;;
esac
+ # Disable Rust if cargo is unavailable.
+ case ${add_this_lang}:${language}:${have_cargo} in
+ yes:rust:no)
+ # Specifically requested language; tell them.
+ AC_MSG_ERROR([cargo is required to build $language])
+ ;;
+ all:rust:no)
+ AC_MSG_WARN([cargo is required to build $language])
+ add_this_lang=unsupported
+ ;;
+ *:rust:no)
+ # Silently disable.
+ add_this_lang=unsupported
+ ;;
+ esac
+
+
# Disable a language that is unsupported by the target.
case "${add_this_lang}: $unsupported_languages " in
no:*) ;;
--
2.43.0