This PR implements the approach suggested in #1734#pullrequestreview-3284918572.
Here is an example of the ctest output:
0$ ctest --test-dir build -j $(nproc)
1Test project /home/hebasto/dev/secp256k1/secp256k1/build
2 Start 1: secp256k1_noverify::ellswift
3 Start 2: secp256k1_noverify::ecmult_constants
4 Start 3: secp256k1_noverify::ecmult
5 Start 4: secp256k1_noverify::integer
6 Start 5: secp256k1_noverify::scalar
7 Start 6: secp256k1_noverify::field
8 Start 7: secp256k1_noverify::group
9 Start 8: secp256k1_noverify::ec
10 Start 9: secp256k1_noverify::ecdh
11 Start 10: secp256k1_noverify::ecdsa
12 Start 11: secp256k1_noverify::recovery
13 Start 12: secp256k1_noverify::extrakeys
14 Start 13: secp256k1_noverify::schnorrsig
15 Start 14: secp256k1_noverify::musig
16 Start 15: secp256k1_noverify::general,hash,utils
17 Start 16: secp256k1_verify::ellswift
18 1/36 Test [#11](/bitcoin-core-secp256k1/11/): secp256k1_noverify::recovery .............***Skipped 0.00 sec
19 Start 17: secp256k1_verify::ecmult_constants
20 2/36 Test [#12](/bitcoin-core-secp256k1/12/): secp256k1_noverify::extrakeys ............ Passed 0.01 sec
21 Start 18: secp256k1_verify::ecmult
22 3/36 Test [#8](/bitcoin-core-secp256k1/8/): secp256k1_noverify::ec ................... Passed 0.01 sec
23 Start 19: secp256k1_verify::integer
24 4/36 Test [#5](/bitcoin-core-secp256k1/5/): secp256k1_noverify::scalar ............... Passed 0.02 sec
25 Start 20: secp256k1_verify::scalar
26 5/36 Test [#15](/bitcoin-core-secp256k1/15/): secp256k1_noverify::general,hash,utils ... Passed 0.02 sec
27 Start 21: secp256k1_verify::field
28 6/36 Test [#13](/bitcoin-core-secp256k1/13/): secp256k1_noverify::schnorrsig ........... Passed 0.03 sec
29 Start 22: secp256k1_verify::group
30 7/36 Test [#9](/bitcoin-core-secp256k1/9/): secp256k1_noverify::ecdh ................. Passed 0.04 sec
31 Start 23: secp256k1_verify::ec
32 8/36 Test [#23](/bitcoin-core-secp256k1/23/): secp256k1_verify::ec ..................... Passed 0.03 sec
33 Start 24: secp256k1_verify::ecdh
34 9/36 Test [#20](/bitcoin-core-secp256k1/20/): secp256k1_verify::scalar ................. Passed 0.05 sec
35 Start 25: secp256k1_verify::ecdsa
3610/36 Test [#14](/bitcoin-core-secp256k1/14/): secp256k1_noverify::musig ................ Passed 0.10 sec
37 Start 26: secp256k1_verify::recovery
3811/36 Test [#26](/bitcoin-core-secp256k1/26/): secp256k1_verify::recovery ...............***Skipped 0.00 sec
39 Start 27: secp256k1_verify::extrakeys
4012/36 Test [#27](/bitcoin-core-secp256k1/27/): secp256k1_verify::extrakeys .............. Passed 0.02 sec
41 Start 28: secp256k1_verify::schnorrsig
4213/36 Test [#24](/bitcoin-core-secp256k1/24/): secp256k1_verify::ecdh ................... Passed 0.12 sec
43 Start 29: secp256k1_verify::musig
4414/36 Test [#28](/bitcoin-core-secp256k1/28/): secp256k1_verify::schnorrsig ............. Passed 0.07 sec
45 Start 30: secp256k1_verify::general,hash,utils
4615/36 Test [#30](/bitcoin-core-secp256k1/30/): secp256k1_verify::general,hash,utils ..... Passed 0.02 sec
47 Start 31: secp256k1_exhaustive
4816/36 Test [#29](/bitcoin-core-secp256k1/29/): secp256k1_verify::musig .................. Passed 0.24 sec
49 Start 32: secp256k1_example::ecdsa
5017/36 Test [#32](/bitcoin-core-secp256k1/32/): secp256k1_example::ecdsa ................. Passed 0.00 sec
51 Start 33: secp256k1_example::ecdh
5218/36 Test [#33](/bitcoin-core-secp256k1/33/): secp256k1_example::ecdh .................. Passed 0.00 sec
53 Start 34: secp256k1_example::schnorr
5419/36 Test [#34](/bitcoin-core-secp256k1/34/): secp256k1_example::schnorr ............... Passed 0.00 sec
55 Start 35: secp256k1_example::ellswift
5620/36 Test [#35](/bitcoin-core-secp256k1/35/): secp256k1_example::ellswift .............. Passed 0.00 sec
57 Start 36: secp256k1_example::musig
5821/36 Test [#36](/bitcoin-core-secp256k1/36/): secp256k1_example::musig ................. Passed 0.00 sec
5922/36 Test [#10](/bitcoin-core-secp256k1/10/): secp256k1_noverify::ecdsa ................ Passed 0.89 sec
6023/36 Test [#6](/bitcoin-core-secp256k1/6/): secp256k1_noverify::field ................ Passed 1.38 sec
6124/36 Test [#21](/bitcoin-core-secp256k1/21/): secp256k1_verify::field .................. Passed 1.47 sec
6225/36 Test [#7](/bitcoin-core-secp256k1/7/): secp256k1_noverify::group ................ Passed 1.51 sec
6326/36 Test [#25](/bitcoin-core-secp256k1/25/): secp256k1_verify::ecdsa .................. Passed 1.68 sec
6427/36 Test [#19](/bitcoin-core-secp256k1/19/): secp256k1_verify::integer ................ Passed 2.76 sec
6528/36 Test [#4](/bitcoin-core-secp256k1/4/): secp256k1_noverify::integer .............. Passed 3.16 sec
6629/36 Test [#3](/bitcoin-core-secp256k1/3/): secp256k1_noverify::ecmult ............... Passed 3.39 sec
6730/36 Test [#1](/bitcoin-core-secp256k1/1/): secp256k1_noverify::ellswift ............. Passed 3.74 sec
6831/36 Test [#22](/bitcoin-core-secp256k1/22/): secp256k1_verify::group .................. Passed 3.97 sec
6932/36 Test [#2](/bitcoin-core-secp256k1/2/): secp256k1_noverify::ecmult_constants ..... Passed 5.15 sec
7033/36 Test [#18](/bitcoin-core-secp256k1/18/): secp256k1_verify::ecmult ................. Passed 6.18 sec
7134/36 Test [#31](/bitcoin-core-secp256k1/31/): secp256k1_exhaustive ..................... Passed 7.53 sec
7235/36 Test [#17](/bitcoin-core-secp256k1/17/): secp256k1_verify::ecmult_constants ....... Passed 9.50 sec
7336/36 Test [#16](/bitcoin-core-secp256k1/16/): secp256k1_verify::ellswift ............... Passed 12.04 sec
74
75100% tests passed, 0 tests failed out of 36
76
77Label Time Summary:
78secp256k1_example = 0.01 sec*proc (5 tests)
79secp256k1_exhaustive = 7.53 sec*proc (1 test)
80secp256k1_noverify = 19.46 sec*proc (15 tests)
81secp256k1_verify = 38.16 sec*proc (15 tests)
82
83Total Test time (real) = 12.05 sec
84
85The following tests did not run:
86 11 - secp256k1_noverify::recovery (Skipped)
87 26 - secp256k1_verify::recovery (Skipped)