You are not logged in.
I'm trying to install https://aur.archlinux.org/packages/units from the AUR. When I attempt to build it (I'm just cloning the repo and using makepkg, not an AUR helper), I get a whole bunch of C compilation errors.
My makepkg output is posted at the end. sudo pacman -Syu reports that "there is nothing to do".
Normally, I'd just add a comment to the package's AUR page, but there's a few things that are a bit weird to me:
I'm very poor at C, but it appears that the errors have to do with a conflicting definition of the strchr function between units.c and units.h, which... seems like a pretty basic mistake, I believe?
units comes from GNU, and I would be surprised that software from GNU would contain a basic C mistake
The package was last updated six months ago, and in that time, nobody else has reported any build errors, so that makes it seem like either something is wrong with MY system, or else something broke very recently
Another AUR package I use (nvidia-470xx-utils) had an issue caused by the recent GCC update to v15, so I'm wondering whether these compilation issues might have been caused by the GCC update as well
I'm just looking for a sanity check - does anything stand out as something I need to fix on my end, or something that might have been caused by the GCC update, or is this something I should simply report on the AUR package's page?
lux@parabolica:~/packages/units (master) $ sudo git clean -fdx
lux@parabolica:~/packages/units (master) $ makepkg -i --skippgpcheck
==> Making package: units 2.24-1 (Thu 01 May 2025 09:54:07 AM CDT)
==> Checking runtime dependencies...
==> Checking buildtime dependencies...
==> Retrieving sources...
-> Downloading units-2.24.tar.gz...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 1458k 100 1458k 0 0 2901k 0 --:--:-- --:--:-- --:--:-- 2905k
-> Downloading units-2.24.tar.gz.sig...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 119 100 119 0 0 570 0 --:--:-- --:--:-- --:--:-- 572
-> Found units_currency.timer
-> Found units_currency.service
==> WARNING: Skipping verification of source file PGP signatures.
==> Validating source files with sha256sums...
units-2.24.tar.gz ... Passed
units-2.24.tar.gz.sig ... Skipped
units_currency.timer ... Passed
units_currency.service ... Passed
==> Extracting sources...
-> Extracting units-2.24.tar.gz with bsdtar
==> Starting build()...
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether the compiler supports GNU C... yes
checking whether gcc accepts -g... yes
checking for gcc option to enable C11 features... none needed
detected non-mac os: linux-gnu
checking whether C compiler accepts -fpic... yes
checking for an ANSI C-conforming const... yes
checking for a BSD-compatible install... /usr/bin/install -c
checking for a race-free mkdir -p... /usr/bin/mkdir -p
checking for library containing sin... -lm
checking for append_history in -lreadline... yes
checking for gcc options needed to detect all undeclared functions... none needed
checking whether rl_completion_suppress_append is declared... no
checking for stdio.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for strings.h... yes
checking for sys/stat.h... yes
checking for sys/types.h... yes
checking for unistd.h... yes
checking for string.h... (cached) yes
checking for stdlib.h... (cached) yes
checking for strchr... yes
checking for strspn... yes
checking for strtok... yes
checking whether TIOCGWINSZ is declared... yes
checking for setenv... yes
checking for setlocale... yes
checking for locale and UTF-8 support... yes
checking for isfinite... yes
checking for mksinfo... no
checking for python3... /usr/bin/python3
configure: creating ./config.status
config.status: creating Makefile
config.status: creating Windows/Makefile
gcc -DUNITSFILE=\"/usr/share/units/definitions.units\" -DLOCALEMAP=\"/usr/share/units/locale_map.txt\" -DREADLINE -DNO_SUPPRESS_APPEND -DHAVE_IOCTL -DSUPPORT_UTF8 -DPACKAGE_NAME=\"GNU\ units\" -DPACKAGE_TARNAME=\"units\" -DPACKAGE_VERSION=\"2.24\" -DPACKAGE_STRING=\"GNU\ units\ 2.24\" -DPACKAGE_BUGREPORT=\"adrianm@gnu.org\" -DPACKAGE_URL=\"https://www.gnu.org/software/units/\" -DHAVE_STDIO_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_STRINGS_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_UNISTD_H=1 -DSTDC_HEADERS=1 -march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -flto=auto -fpic -I. -c units.c
In file included from units.c:92:
units.h:57:12: error: conflicting types for ‘strchr’; have ‘char *(void)’
57 | char *strchr();
| ^~~~~~
In file included from /usr/include/readline/chardefs.h:35,
from /usr/include/readline/keymaps.h:35,
from /usr/include/readline/readline.h:37,
from units.c:84:
/usr/include/string.h:246:14: note: previous declaration of ‘strchr’ with type ‘char *(const char *, int)’
246 | extern char *strchr (const char *__s, int __c)
| ^~~~~~
units.c: In function ‘hassubscript’:
units.c:495:10: error: too many arguments to function ‘strchr’; expected 0, have 2
495 | if (!strchr(digits, *ptr))
| ^~~~~~ ~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘strip_comment’:
units.c:881:15: error: too many arguments to function ‘strchr’; expected 0, have 2
881 | if ((line = strchr(line,COMMENTCHAR))) {
| ^~~~~~ ~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘isdecimal’:
units.c:956:10: error: too many arguments to function ‘strchr’; expected 0, have 2
956 | return strchr(digits, c) != NULL;
| ^~~~~~ ~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘checkunitname’:
units.c:977:7: error: too many arguments to function ‘strchr’; expected 0, have 2
977 | if (strchr(digits, name[0])){
| ^~~~~~ ~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘newunit’:
units.c:1016:7: error: too many arguments to function ‘strchr’; expected 0, have 2
1016 | if (strchr(".,23456789", lastchar(unitname)) && !hassubscript(unitname)){
| ^~~~~~ ~~~~~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘parsepair’:
units.c:1131:12: error: too many arguments to function ‘strchr’; expected 0, have 2
1131 | middle = strchr(start,delimiter);
| ^~~~~~ ~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘newfunction’:
units.c:1296:11: error: too many arguments to function ‘strchr’; expected 0, have 2
1296 | start = strchr(unitname,'(');
| ^~~~~~ ~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:1297:9: error: too many arguments to function ‘strchr’; expected 0, have 2
1297 | end = strchr(unitname,')');
| ^~~~~~ ~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:1463:9: error: too many arguments to function ‘strchr’; expected 0, have 2
1463 | inv = strchr(unitdef,FUNCSEPCHAR);
| ^~~~~~ ~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘newtable’:
units.c:1496:15: error: too many arguments to function ‘strchr’; expected 0, have 2
1496 | tableunit = strchr(unitname,'[');
| ^~~~~~ ~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:1497:9: error: too many arguments to function ‘strchr’; expected 0, have 2
1497 | end = strchr(unitname,']');
| ^~~~~~ ~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘newalias’:
units.c:1593:8: error: too many arguments to function ‘strchr’; expected 0, have 2
1593 | if (!strchr(unitdef, UNITSEPCHAR)){
| ^~~~~~ ~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘readunits’:
units.c:1983:16: error: too many arguments to function ‘strchr’; expected 0, have 2
1983 | else if (strchr(unitname,'[')){ /* table definition */
| ^~~~~~ ~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:1995:16: error: too many arguments to function ‘strchr’; expected 0, have 2
1995 | else if (strchr(unitname,'(')){ /* function definition */
| ^~~~~~ ~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘reduceproduct’:
units.c:2366:14: error: too many arguments to function ‘strchr’; expected 0, have 2
2366 | if (strchr(toadd, PRIMITIVECHAR))
| ^~~~~~ ~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘ignore_primitive’:
units.c:2470:13: error: too many arguments to function ‘strchr’; expected 0, have 2
2470 | if (ul && strchr(ul->value, PRIMITIVECHAR))
| ^~~~~~ ~~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘showdefinition’:
units.c:3063:13: error: too many arguments to function ‘strchr’; expected 0, have 2
3063 | && !strchr(unitstr,PRIMITIVECHAR)) {
| ^~~~~~ ~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘checksigdigits’:
units.c:3328:14: error: too many arguments to function ‘strchr’; expected 0, have 2
3328 | else if (strchr("EeGg", num_format.type) && ival > MAXPRECISION) {
| ^~~~~~ ~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘parsenumformat’:
units.c:3430:12: error: too many arguments to function ‘strchr’; expected 0, have 2
3430 | dotptr = strchr(num_format.format, '.');
| ^~~~~~ ~~~~~~~~~~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:3440:16: error: too many arguments to function ‘strchr’; expected 0, have 2
3440 | while (*p && strchr(format_flags, *p)) {
| ^~~~~~ ~~~~~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:3499:9: error: too many arguments to function ‘strchr’; expected 0, have 2
3499 | if (strchr(format_types, *nonum)) {
| ^~~~~~ ~~~~~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘round_output’:
units.c:3589:7: error: too many arguments to function ‘strchr’; expected 0, have 2
3589 | if (strchr("Ff", num_format.type)) {
| ^~~~~~ ~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:3599:7: error: too many arguments to function ‘strchr’; expected 0, have 2
3599 | if (strchr(num_format.format, '\'') && strchr("FfGg", num_format.type))
| ^~~~~~ ~~~~~~~~~~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:3599:42: error: too many arguments to function ‘strchr’; expected 0, have 2
3599 | if (strchr(num_format.format, '\'') && strchr("FfGg", num_format.type))
| ^~~~~~ ~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘displays_as’:
units.c:3701:7: error: too many arguments to function ‘strchr’; expected 0, have 2
3701 | if (strchr("Ff", num_format.type)) {
| ^~~~~~ ~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:3711:7: error: too many arguments to function ‘strchr’; expected 0, have 2
3711 | if (strchr(num_format.format, '\'') && strchr("FfGg", num_format.type))
| ^~~~~~ ~~~~~~~~~~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:3711:42: error: too many arguments to function ‘strchr’; expected 0, have 2
3711 | if (strchr(num_format.format, '\'') && strchr("FfGg", num_format.type))
| ^~~~~~ ~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘showanswer’:
units.c:3806:15: error: too many arguments to function ‘strchr’; expected 0, have 2
3806 | else if (strchr(havestr,'/')) {
| ^~~~~~ ~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘addtolist’:
units.c:4045:9: error: too many arguments to function ‘strchr’; expected 0, have 2
4045 | if (strchr(def, PRIMITIVECHAR))
| ^~~~~~ ~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘tryallunits’:
units.c:4172:14: error: too many arguments to function ‘strchr’; expected 0, have 2
4172 | seploc = strchr(firstunit,UNITSEPCHAR); /* Alias definitions allowed in */
| ^~~~~~ ~~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘getprogdir’:
units.c:1675:25: error: too many arguments to function ‘strchr’; expected 0, have 2
1675 | # define hasdirsep(s) strchr((s),'/')
| ^~~~~~ ~~~
units.c:4491:44: note: in expansion of macro ‘hasdirsep’
4491 | if (!progdir && (isfullpath(progname) || hasdirsep(progname)))
| ^~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:4523:21: error: too many arguments to function ‘strchr’; expected 0, have 2
4523 | direc_end = strchr(direc,PATHSEP);
| ^~~~~~ ~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘processargs’:
units.c:5380:11: error: too many arguments to function ‘strchr’; expected 0, have 2
5380 | temp = strchr(mylocale,'.');
| ^~~~~~ ~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘processunit’:
units.c:5459:26: error: too many arguments to function ‘strchr’; expected 0, have 2
5459 | if (flags.unitlists && strchr(unitstr, UNITSEPCHAR)){
| ^~~~~~ ~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘definevariable’:
units.c:5505:17: error: too many arguments to function ‘strchr’; expected 0, have 2
5505 | char *value = strchr(def,'=');
| ^~~~~~ ~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘checkunitlist’:
units.c:5621:24: error: too many arguments to function ‘strchr’; expected 0, have 2
5621 | if ((nextunitstr = strchr(unitstr, UNITSEPCHAR)) != 0)
| ^~~~~~ ~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:5664:13: error: too many arguments to function ‘strchr’; expected 0, have 2
5664 | *(strchr(firstunitstr, UNITSEPCHAR)) = '\0';
| ^~~~~~ ~~~~~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘processwant’:
units.c:5706:26: error: too many arguments to function ‘strchr’; expected 0, have 2
5706 | if (flags.unitlists && strchr(unitstr, UNITSEPCHAR))
| ^~~~~~ ~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘checkunits’:
units.c:5767:11: error: too many arguments to function ‘strchr’; expected 0, have 2
5767 | if (strchr(uptr->value, PRIMITIVECHAR))
| ^~~~~~ ~~~~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘showunitlist’:
units.c:5866:24: error: too many arguments to function ‘strchr’; expected 0, have 2
5866 | if ((nextunitstr = strchr(wantstr, UNITSEPCHAR)))
| ^~~~~~ ~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘issetting’:
units.c:6415:7: error: too many arguments to function ‘strchr’; expected 0, have 2
6415 | if (strchr("Ee", num_format.type))
| ^~~~~~ ~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:6462:11: error: too many arguments to function ‘strchr’; expected 0, have 2
6462 | if (strchr("EeGg", num_format.type))
| ^~~~~~ ~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:6511:15: error: too many arguments to function ‘strchr’; expected 0, have 2
6511 | if (strchr(p2, '=')) {
| ^~~~~~ ~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:6635:20: error: too many arguments to function ‘strchr’; expected 0, have 2
6635 | else if (strchr("EeGg", num_format.type) && value > MAXPRECISION) {
| ^~~~~~ ~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:6649:15: error: too many arguments to function ‘strchr’; expected 0, have 2
6649 | if (strchr("Ee", num_format.type))
| ^~~~~~ ~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:6669:38: error: too many arguments to function ‘strchr’; expected 0, have 2
6669 | printf(" %s = %s\n", tag, strchr("Ee", num_format.type) ? YES_STR : NO_STR);
| ^~~~~~ ~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:6677:16: error: too many arguments to function ‘strchr’; expected 0, have 2
6677 | if (!strchr("Ee", num_format.type)) {
| ^~~~~~ ~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:6682:15: error: too many arguments to function ‘strchr’; expected 0, have 2
6682 | if (strchr("Gg", num_format.type))
| ^~~~~~ ~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:6690:19: error: too many arguments to function ‘strchr’; expected 0, have 2
6690 | if (strchr("Gg", lastformattype))
| ^~~~~~ ~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘checklocale’:
units.c:6766:12: error: too many arguments to function ‘strchr’; expected 0, have 2
6766 | temp = strchr(mylocale,'.');
| ^~~~~~ ~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘remaplocale’:
units.c:6859:19: error: too many arguments to function ‘strchr’; expected 0, have 2
6859 | if ((hyphen = strchr(mylocale, '-')))
| ^~~~~~ ~~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:6865:13: error: too many arguments to function ‘strchr’; expected 0, have 2
6865 | value=strchr(name,'#');
| ^~~~~~ ~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:6867:13: error: too many arguments to function ‘strchr’; expected 0, have 2
6867 | value=strchr(name,'\t');
| ^~~~~~ ~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c: In function ‘main’:
units.c:7069:12: error: too many arguments to function ‘strchr’; expected 0, have 2
7069 | if (strchr("Ee", num_format.type))
| ^~~~~~ ~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:7168:10: error: too many arguments to function ‘strchr’; expected 0, have 2
7168 | if (strchr(wantstr, UNITSEPCHAR)){
| ^~~~~~ ~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
units.c:7251:17: error: too many arguments to function ‘strchr’; expected 0, have 2
7251 | else if (strchr(wantstr, UNITSEPCHAR))
| ^~~~~~ ~~~~~~~
units.h:57:12: note: declared here
57 | char *strchr();
| ^~~~~~
make: *** [Makefile:82: units.o] Error 1
==> ERROR: A failure occurred in build().
Aborting...
Last edited by ModelHX (2025-05-01 16:35:02)
Offline
Mod note: Moving to AUR Issues.
Sakura:-
Mobo: MSI MAG X570S TORPEDO MAX // Processor: AMD Ryzen 9 5950X @4.9GHz // GFX: AMD Radeon RX 5700 XT // RAM: 32GB (4x 8GB) Corsair DDR4 (@ 3000MHz) // Storage: 1x 3TB HDD, 6x 1TB SSD, 2x 120GB SSD, 1x 275GB M2 SSD
Making lemonade from lemons since 2015.
Offline
AUR compiling issues should always be addressed in the AUR package maintainer, the package maintainer should be doing their due diligence to ensure that issue is with upstream and not the PKGBUILD.
Offline
Understood; I was mostly looking to make sure I hadn't goofed on my end, or was missing something stupid, before reaching out to the maintainer. (It didn't help that I was the first one to notice the issue.)
I found that this IS an issue with the GCC 15 release; I was able to tweak the files to get it to build, so I'll reach out to the maintainer with a patch.
Offline