Repository: bitcoin/bitcoin (language: cpp)

Issue:
build: depends cross-compile using Clang fails
Seems like CMake is getting confused, and trying to build and link a `x86_64` binary, when it's meant to be (and thinks it is, according to the  configure output) building for `aarch64`:
```bash
make -C depends/ CC=clang CXX=clang++ AR=llvm-ar NM=llvm-nm RANLIB=llvm-ranlib STRIP=llvm-strip NO_QT=1 NO_WALLET=1 NO_USDT=1 NO_ZMQ=1 -j18 HOST=aarch64-linux-gnu
<snip>
copying packages: boost libevent
to: /root/ci_scratch/depends/aarch64-linux-gnu
To build Bitcoin Core with these packages, pass '--toolchain /root/ci_scratch/depends/aarch64-linux-gnu/toolchain.cmake' to the first CMake invocation.

cmake -B build --toolchain /root/ci_scratch/depends/aarch64-linux-gnu/toolchain.cmake
<snip>
Cross compiling ....................... TRUE, for Linux, aarch64
C++ compiler .......................... Clang 18.1.3, /usr/bin/clang++
<snip>
cmake --build build -j18 --target bitcoind --verbose
[ 98%] Linking CXX executable bitcoind
cd /root/ci_scratch/build/src && /usr/bin/cmake -E cmake_link_script CMakeFiles/bitcoind.dir/link.txt --verbose=1
/usr/bin/clang++ -pipe -std=c++20 -O2 -O2 -g -fstack-protector-all -fcf-protection=full -fstack-clash-protection -Wl,-z,relro -Wl,-z,now -Wl,-z,separate-code -fPIE -pie CMakeFiles/bitcoind.dir/bitcoind.cpp.o CMakeFiles/bitcoind.dir/init/bitcoind.cpp.o -o bitcoind  libbitcoin_node.a libbitcoin_common.a libbitcoin_consensus.a secp256k1/lib/libsecp256k1.a util/libbitcoin_util.a crypto/libbitcoin_crypto.a crypto/libbitcoin_crypto_sse41.a crypto/libbitcoin_crypto_avx2.a crypto/libbitcoin_crypto_x86_shani.a ../libleveldb.a ../libcrc32c.a ../libcrc32c_sse42.a ../libminisketch.a univalue/libunivalue.a /root/ci_scratch/depends/aarch64-linux-gnu/lib/libevent_extra.a /root/ci_scratch/depends/aarch64-linux-gnu/lib/libevent_pthreads.a /root/ci_scratch/depends/aarch64-linux-gnu/lib/libevent_core.a  
/usr/bin/ld: /root/ci_scratch/depends/aarch64-linux-gnu/lib/libevent_extra.a(http.c.o): Relocations in generic ELF (EM: 183)
/usr/bin/ld: /root/ci_scratch/depends/aarch64-linux-gnu/lib/libevent_extra.a(http.c.o): Relocations in generic ELF (EM: 183)
/usr/bin/ld: /root/ci_scratch/depends/aarch64-linux-gnu/lib/libevent_extra.a(http.c.o): Relocations in generic ELF (EM: 183)
/usr/bin/ld: /root/ci_scratch/depends/aarch64-linux-gnu/lib/libevent_extra.a(http.c.o): Relocations in generic ELF (EM: 183)
/usr/bin/ld: /root/ci_scratch/depends/aarch64-linux-gnu/lib/libevent_extra.a: error adding symbols: file in wrong format
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
gmake[3]: *** [src/CMakeFiles/bitcoind.dir/build.make:130: src/bitcoind] Error 1
```
Maybe there's something missing from the toolchain that we should be passing through. The libs in depends have been compiled for aarch64, i.e:
```bash
objdump -x /root/ci_scratch/depends/aarch64-linux-gnu/lib/libevent_extra.a | grep aarch64
In archive /root/ci_scratch/depends/aarch64-linux-gnu/lib/libevent_extra.a:
event_tagging.c.o:     file format elf64-littleaarch64
architecture: aarch64, flags 0x00000011:
http.c.o:     file format elf64-littleaarch64
```

However CMake is building x86_64 object files:
```bash
file build/CMakeFiles/leveldb.dir/src/leveldb/db/filename.cc.o
build/CMakeFiles/leveldb.dir/src/leveldb/db/filename.cc.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), with debug_info, not stripped
```
and binaries:
```bash
file build/src/bitcoin-util 
build/src/bitcoin-util: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=4ccab1d492154df5dd9a115e6bbc52371d7439b1, for GNU/Linux 3.2.0, with debug_info, not stripped
```


Discussion / hints:
Maybe dumb question but are you building on a x86_64 system where `clang` and `clang++` executables produce x86_64 binaries? If so I would guess this is caused by your `CC=clang CXX=clang++` variables.
> are you building on a x86_64 system where clang and clang++ executables produce x86_64 binaries?

Yes.

>  If so I would guess this is caused by your CC=clang CXX=clang++ variables.

Not sure I follow. Depends was configured to cross-compile for aarch64-linux using Clang as the compiler. This has worked fine and produced aarch64 code and libraries. We then pass the toolchain file from depends to CMake (which should contain everything CMake needs to know produce aarch64 linux binaries using the just compiled aarch64 libraries). CMake has configured using Clang as the compiler, and think it's cross-compiling for `aarch64`, according to it's own output:
> Cross compiling ....................... TRUE, for Linux, aarch64

Then it proceeds to produce `x86_64` code.
CC=clang CXX=clang++ specify paths to specific compiler binaries, and compiler binaries usually have a default platform that they target. On an x86_64 system they will usually produce x86_64 binaries unless passed additional flags which I don't think the depends system is using.

The host string aarch64-linux-gnu you are specifying will be used to find the right compiler binaries for that host by default, but if you are overriding the compiler, the compiler you specified will take precedence.

I could be wrong about this or misunderstanding something fundamental but I'd try to do this without the CC=clang CXX=clang++ AR=... stuff if that makes any sense for your use case. If it doesn't make sense please ignore.

You could also try CC=aarch64-linux-gnu-clang etc or whatever the aarch64 cross-compiler path is
> You could also try CC=aarch64-linux-gnu-clang etc or whatever the aarch64 cross-compiler path is

You don't really need to do this with, clang, it is natively a cross-compiler. You can (generally) just pass `--target=whatever`, and generate code for that target, without needing a specially compiled `clang` binary. In this case, by specifying `HOST=aarch64-linux-gnu`, I end up with compiler invocations like `clang --target=aarch64-linux-gnu`, and everything works as expected in depends. The issue seems to be that these flags are not being properly propogated into the CMake toolchain file, and then missing for the Core build.
> > You could also try CC=aarch64-linux-gnu-clang etc or whatever the aarch64 cross-compiler path is
> 
> You don't really need to do this with, clang, it is natively a cross-compiler.

Yes that is what I meant by "compiler binaries usually have a default platform that they target".

Maybe I misunderstood context for your post and thought you were reporting a bug and looking for a workaround, not just reporting a bug. I think I agree that dropping CC=clang or specifying CC=aarch64-linux-gnu-clang would just be workarounds.

Fix patch:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8b7e663134866..a5e3670ba40cb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -26,7 +26,7 @@ set(CLIENT_NAME "Bitcoin Core")
 set(CLIENT_VERSION_MAJOR 29)
 set(CLIENT_VERSION_MINOR 0)
 set(CLIENT_VERSION_BUILD 0)
-set(CLIENT_VERSION_RC 2)
+set(CLIENT_VERSION_RC 3)
 set(CLIENT_VERSION_IS_RELEASE "true")
 set(COPYRIGHT_YEAR "2025")
 
@@ -376,6 +376,7 @@ if(SANITIZERS)
       int main() { return 0; }
     "
     RESULT_VAR linker_supports_sanitizers
+    NO_CACHE_IF_FAILED
   )
   if(NOT linker_supports_sanitizers)
     message(FATAL_ERROR "Linker did not accept requested flags, you are missing required libraries.")
diff --git a/cmake/module/TryAppendLinkerFlag.cmake b/cmake/module/TryAppendLinkerFlag.cmake
index be41a2e1cc2d9..fe7c2bce51ef4 100644
--- a/cmake/module/TryAppendLinkerFlag.cmake
+++ b/cmake/module/TryAppendLinkerFlag.cmake
@@ -20,7 +20,7 @@ In configuration output, this function prints a string by the following pattern:
 function(try_append_linker_flag flag)
   cmake_parse_arguments(PARSE_ARGV 1
     TALF                              # prefix
-    ""                                # options
+    "NO_CACHE_IF_FAILED"              # options
     "TARGET;VAR;SOURCE;RESULT_VAR"    # one_value_keywords
     "IF_CHECK_PASSED"                 # multi_value_keywords
   )
@@ -68,6 +68,10 @@ function(try_append_linker_flag flag)
   if(DEFINED TALF_RESULT_VAR)
     set(${TALF_RESULT_VAR} "${${result}}" PARENT_SCOPE)
   endif()
+
+  if(NOT ${result} AND TALF_NO_CACHE_IF_FAILED)
+    unset(${result} CACHE)
+  endif()
 endfunction()
 
 if(MSVC)
diff --git a/depends/Makefile b/depends/Makefile
index 25c8646739458..3dbd69221aa8d 100644
--- a/depends/Makefile
+++ b/depends/Makefile
@@ -206,6 +206,7 @@ endif
 $(host_prefix)/toolchain.cmake : toolchain.cmake.in $(host_prefix)/.stamp_$(final_build_id)
 	@mkdir -p $(@D)
 	sed -e 's|@depends_crosscompiling@|$(crosscompiling)|' \
+            -e 's|@host@|$(host)|' \
             -e 's|@host_system_name@|$($(host_os)_cmake_system_name)|' \
             -e 's|@host_system_version@|$($(host_os)_cmake_system_version)|' \
             -e 's|@host_arch@|$(host_arch)|' \
diff --git a/depends/toolchain.cmake.in b/depends/toolchain.cmake.in
index 89a6e369690fd..65036d07a9ef8 100644
--- a/depends/toolchain.cmake.in
+++ b/depends/toolchain.cmake.in
@@ -13,6 +13,10 @@ if(@depends_crosscompiling@)
   set(CMAKE_SYSTEM_NAME @host_system_name@)
   set(CMAKE_SYSTEM_VERSION @host_system_version@)
   set(CMAKE_SYSTEM_PROCESSOR @host_arch@)
+
+  set(CMAKE_C_COMPILER_TARGET @host@)
+  set(CMAKE_CXX_COMPILER_TARGET @host@)
+  set(CMAKE_OBJCXX_COMPILER_TARGET @host@)
 endif()
 
 if(NOT DEFINED CMAKE_C_FLAGS_INIT)
diff --git a/doc/man/bitcoin-cli.1 b/doc/man/bitcoin-cli.1
index 94d06025c3aef..d4095c8478000 100644
--- a/doc/man/bitcoin-cli.1
+++ b/doc/man/bitcoin-cli.1
@@ -1,7 +1,7 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.49.3.
-.TH BITCOIN-CLI "1" "March 2025" "bitcoin-cli v29.0.0rc2" "User Commands"
+.TH BITCOIN-CLI "1" "March 2025" "bitcoin-cli v29.0.0rc3" "User Commands"
 .SH NAME
-bitcoin-cli \- manual page for bitcoin-cli v29.0.0rc2
+bitcoin-cli \- manual page for bitcoin-cli v29.0.0rc3
 .SH SYNOPSIS
 .B bitcoin-cli
 [\fI\,options\/\fR] \fI\,<command> \/\fR[\fI\,params\/\fR]
@@ -15,7 +15,7 @@ bitcoin-cli \- manual page for bitcoin-cli v29.0.0rc2
 .B bitcoin-cli
 [\fI\,options\/\fR] \fI\,help <command>\/\fR
 .SH DESCRIPTION
-Bitcoin Core RPC client version v29.0.0rc2
+Bitcoin Core RPC client version v29.0.0rc3
 .PP
 The bitcoin\-cli utility provides a command line interface to interact with a Bitcoin Core RPC server.
 .PP
diff --git a/doc/man/bitcoin-qt.1 b/doc/man/bitcoin-qt.1
index 58640975b8c3d..1e49f6925d010 100644
--- a/doc/man/bitcoin-qt.1
+++ b/doc/man/bitcoin-qt.1
@@ -1,12 +1,12 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.49.3.
-.TH BITCOIN-QT "1" "March 2025" "bitcoin-qt v29.0.0rc2" "User Commands"
+.TH BITCOIN-QT "1" "March 2025" "bitcoin-qt v29.0.0rc3" "User Commands"
 .SH NAME
-bitcoin-qt \- manual page for bitcoin-qt v29.0.0rc2
+bitcoin-qt \- manual page for bitcoin-qt v29.0.0rc3
 .SH SYNOPSIS
 .B bitcoin-qt
 [\fI\,options\/\fR] [\fI\,URI\/\fR]
 .SH DESCRIPTION
-Bitcoin Core version v29.0.0rc2
+Bitcoin Core version v29.0.0rc3
 .PP
 The bitcoin\-qt application provides a graphical interface for interacting with Bitcoin Core.
 .PP
diff --git a/doc/man/bitcoin-tx.1 b/doc/man/bitcoin-tx.1
index 7d4f7de5a3950..0f5b79854fb62 100644
--- a/doc/man/bitcoin-tx.1
+++ b/doc/man/bitcoin-tx.1
@@ -1,7 +1,7 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.49.3.
-.TH BITCOIN-TX "1" "March 2025" "bitcoin-tx v29.0.0rc2" "User Commands"
+.TH BITCOIN-TX "1" "March 2025" "bitcoin-tx v29.0.0rc3" "User Commands"
 .SH NAME
-bitcoin-tx \- manual page for bitcoin-tx v29.0.0rc2
+bitcoin-tx \- manual page for bitcoin-tx v29.0.0rc3
 .SH SYNOPSIS
 .B bitcoin-tx
 [\fI\,options\/\fR] \fI\,<hex-tx> \/\fR[\fI\,commands\/\fR]
@@ -9,7 +9,7 @@ bitcoin-tx \- manual page for bitcoin-tx v29.0.0rc2
 .B bitcoin-tx
 [\fI\,options\/\fR] \fI\,-create \/\fR[\fI\,commands\/\fR]
 .SH DESCRIPTION
-Bitcoin Core bitcoin\-tx utility version v29.0.0rc2
+Bitcoin Core bitcoin\-tx utility version v29.0.0rc3
 .PP
 The bitcoin\-tx tool is used for creating and modifying bitcoin transactions.
 .PP
diff --git a/doc/man/bitcoin-util.1 b/doc/man/bitcoin-util.1
index 44ff8e860a6d4..9c7585c89b6d7 100644
--- a/doc/man/bitcoin-util.1
+++ b/doc/man/bitcoin-util.1
@@ -1,7 +1,7 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.49.3.
-.TH BITCOIN-UTIL "1" "March 2025" "bitcoin-util v29.0.0rc2" "User Commands"
+.TH BITCOIN-UTIL "1" "March 2025" "bitcoin-util v29.0.0rc3" "User Commands"
 .SH NAME
-bitcoin-util \- manual page for bitcoin-util v29.0.0rc2
+bitcoin-util \- manual page for bitcoin-util v29.0.0rc3
 .SH SYNOPSIS
 .B bitcoin-util
 [\fI\,options\/\fR] [\fI\,command\/\fR]
@@ -9,7 +9,7 @@ bitcoin-util \- manual page for bitcoin-util v29.0.0rc2
 .B bitcoin-util
 [\fI\,options\/\fR] \fI\,grind <hex-block-header>\/\fR
 .SH DESCRIPTION
-Bitcoin Core bitcoin\-util utility version v29.0.0rc2
+Bitcoin Core bitcoin\-util utility version v29.0.0rc3
 .PP
 The bitcoin\-util tool provides bitcoin related functionality that does not rely on the ability to access a running node. Available [commands] are listed below.
 .SH OPTIONS
diff --git a/doc/man/bitcoin-wallet.1 b/doc/man/bitcoin-wallet.1
index b41d5e965e071..f01c058282c9f 100644
--- a/doc/man/bitcoin-wallet.1
+++ b/doc/man/bitcoin-wallet.1
@@ -1,12 +1,12 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.49.3.
-.TH BITCOIN-WALLET "1" "March 2025" "bitcoin-wallet v29.0.0rc2" "User Commands"
+.TH BITCOIN-WALLET "1" "March 2025" "bitcoin-wallet v29.0.0rc3" "User Commands"
 .SH NAME
-bitcoin-wallet \- manual page for bitcoin-wallet v29.0.0rc2
+bitcoin-wallet \- manual page for bitcoin-wallet v29.0.0rc3
 .SH SYNOPSIS
 .B bitcoin-wallet
 [\fI\,options\/\fR] \fI\,<command>\/\fR
 .SH DESCRIPTION
-Bitcoin Core bitcoin\-wallet utility version v29.0.0rc2
+Bitcoin Core bitcoin\-wallet utility version v29.0.0rc3
 .PP
 bitcoin\-wallet is an offline tool for creating and interacting with Bitcoin Core wallet files.
 .PP
diff --git a/doc/man/bitcoind.1 b/doc/man/bitcoind.1
index b5993a052ad40..92ef813d959a4 100644
--- a/doc/man/bitcoind.1
+++ b/doc/man/bitcoind.1
@@ -1,12 +1,12 @@
 .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.49.3.
-.TH BITCOIND "1" "March 2025" "bitcoind v29.0.0rc2" "User Commands"
+.TH BITCOIND "1" "March 2025" "bitcoind v29.0.0rc3" "User Commands"
 .SH NAME
-bitcoind \- manual page for bitcoind v29.0.0rc2
+bitcoind \- manual page for bitcoind v29.0.0rc3
 .SH SYNOPSIS
 .B bitcoind
 [\fI\,options\/\fR]
 .SH DESCRIPTION
-Bitcoin Core daemon version v29.0.0rc2
+Bitcoin Core daemon version v29.0.0rc3
 .PP
 The Bitcoin Core daemon (bitcoind) is a headless program that connects to the Bitcoin network to validate and relay transactions and blocks, as well as relaying addresses.
 .PP


Test patch:
diff --git a/src/test/fuzz/base_encode_decode.cpp b/src/test/fuzz/base_encode_decode.cpp
index 2ffcbdf7207ac..450881871782c 100644
--- a/src/test/fuzz/base_encode_decode.cpp
+++ b/src/test/fuzz/base_encode_decode.cpp
@@ -92,5 +92,6 @@ FUZZ_TARGET(psbt_base64_decode)
 
     PartiallySignedTransaction psbt;
     std::string error;
-    assert(DecodeBase64PSBT(psbt, random_string, error) == error.empty());
+    const bool ok{DecodeBase64PSBT(psbt, random_string, error)};
+    assert(ok == error.empty());
 }
diff --git a/src/test/fuzz/rbf.cpp b/src/test/fuzz/rbf.cpp
index 3e5b361186ad0..db8682e27c4d9 100644
--- a/src/test/fuzz/rbf.cpp
+++ b/src/test/fuzz/rbf.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2020-2022 The Bitcoin Core developers
+// Copyright (c) 2020-present The Bitcoin Core developers
 // Distributed under the MIT software license, see the accompanying
 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 
@@ -108,7 +108,7 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf)
 
     // Add a bunch of parent-child pairs to the mempool, and remember them.
     std::vector<CTransaction> mempool_txs;
-    size_t iter{0};
+    uint32_t iter{0};
 
     // Keep track of the total vsize of CTxMemPoolEntry's being added to the mempool to avoid overflow
     // Add replacement_vsize since this is added to new diagram during RBF check
@@ -116,9 +116,8 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf)
     if (!replacement_tx) {
         return;
     }
-    assert(iter <= g_outpoints.size());
     replacement_tx->vin.resize(1);
-    replacement_tx->vin[0].prevout = g_outpoints[iter++];
+    replacement_tx->vin[0].prevout = g_outpoints.at(iter++);
     CTransaction replacement_tx_final{*replacement_tx};
     auto replacement_entry = ConsumeTxMemPoolEntry(fuzzed_data_provider, replacement_tx_final);
     int32_t replacement_vsize = replacement_entry.GetTxSize();
@@ -126,13 +125,13 @@ FUZZ_TARGET(package_rbf, .init = initialize_package_rbf)
 
     LOCK2(cs_main, pool.cs);
 
-    LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), NUM_ITERS)
-    {
+    while (fuzzed_data_provider.ConsumeBool()) {
+        if (iter >= NUM_ITERS) break;
+
         // Make sure txns only have one input, and that a unique input is given to avoid circular references
         CMutableTransaction parent;
-        assert(iter <= g_outpoints.size());
         parent.vin.resize(1);
-        parent.vin[0].prevout = g_outpoints[iter++];
+        parent.vin[0].prevout = g_outpoints.at(iter++);
         parent.vout.emplace_back(0, CScript());
 
         mempool_txs.emplace_back(parent);
diff --git a/test/functional/feature_config_args.py b/test/functional/feature_config_args.py
index e8fc1aca46c64..c5e3c33b14d0e 100755
--- a/test/functional/feature_config_args.py
+++ b/test/functional/feature_config_args.py
@@ -24,6 +24,9 @@ def add_options(self, parser):
     def set_test_params(self):
         self.setup_clean_chain = True
         self.num_nodes = 1
+        # Prune to prevent disk space warning on CI systems with limited space,
+        # when using networks other than regtest.
+        self.extra_args = [["-prune=550"]]
         self.supports_cli = False
         self.wallet_names = []
         self.disable_autoconnect = False
@@ -471,32 +474,21 @@ def test_testnet3_deprecation_msg(self):
         self.log.info("Test testnet3 deprecation warning")
         t3_warning_log = "Warning: Support for testnet3 is deprecated and will be removed in an upcoming release. Consider switching to testnet4."
 
-        def warning_msg(node, approx_size):
-            return f'Warning: Disk space for "{node.datadir_path / node.chain / "blocks" }" may not accommodate the block files. Approximately {approx_size} GB of data will be stored in this directory.'
-
-        # Testnet3 node will log the warning
+        self.log.debug("Testnet3 node will log the deprecation warning")
         self.nodes[0].chain = 'testnet3'
         self.nodes[0].replace_in_config([('regtest=', 'testnet='), ('[regtest]', '[test]')])
         with self.nodes[0].assert_debug_log([t3_warning_log]):
             self.start_node(0)
-        # Some CI environments will have limited space and some others won't
-        # so we need to handle both cases as a valid result.
-        self.nodes[0].stderr.seek(0)
-        err = self.nodes[0].stdout.read()
-        self.nodes[0].stderr.seek(0)
-        self.nodes[0].stderr.truncate()
-        if err != b'' and err != warning_msg(self.nodes[0], 42):
-            raise AssertionError("Unexpected stderr after shutdown of Testnet3 node")
         self.stop_node(0)
 
-        # Testnet4 node will not log the warning
+        self.log.debug("Testnet4 node will not log the deprecation warning")
         self.nodes[0].chain = 'testnet4'
         self.nodes[0].replace_in_config([('testnet=', 'testnet4='), ('[test]', '[testnet4]')])
         with self.nodes[0].assert_debug_log([], unexpected_msgs=[t3_warning_log]):
             self.start_node(0)
         self.stop_node(0)
 
-        # Reset to regtest
+        self.log.debug("Reset to regtest")
         self.nodes[0].chain = 'regtest'
         self.nodes[0].replace_in_config([('testnet4=', 'regtest='), ('[testnet4]', '[regtest]')])
 
diff --git a/test/functional/feature_signet.py b/test/functional/feature_signet.py
index 63091b3ee8738..02e37f0fdd3c9 100755
--- a/test/functional/feature_signet.py
+++ b/test/functional/feature_signet.py
@@ -26,12 +26,14 @@
 
 class SignetParams:
     def __init__(self, challenge=None):
+        # Prune to prevent disk space warning on CI systems with limited space,
+        # when using networks other than regtest.
         if challenge is None:
             self.challenge = SIGNET_DEFAULT_CHALLENGE
-            self.shared_args = []
+            self.shared_args = ["-prune=550"]
         else:
             self.challenge = challenge
-            self.shared_args = [f"-signetchallenge={challenge}"]
+            self.shared_args = ["-prune=550", f"-signetchallenge={challenge}"]
 
 class SignetBasicTest(BitcoinTestFramework):
     def set_test_params(self):