The build farm success because the configure result: checking which CRC-32C
implementation to use... slicing-by-8

My test machine's configure result: checking which CRC-32C implementation
to use... ARMv8 CRC instructions with runtime check

More info about the machine:
uname -a:
Linux xxx 4.18.0-348.20.1.el7.aarch64 #1 SMP Wed Apr 13 20:57:50 UTC 2022
aarch64 aarch64 aarch64 GNU/Linux

cat /usr/include/bits/hwcap.h
/* Defines for bits in AT_HWCAP.
   Copyright (C) 2012 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#ifndef _SYS_AUXV_H
# error "Never include <bits/hwcap.h> directly; use <sys/auxv.h> instead."
#endif

/* No bits defined for this architecture.  */


rpm -qa | grep glibc
glibc-headers-2.17-326.el7_9.aarch64
glibc-common-2.17-326.el7_9.aarch64
glibc-devel-2.17-326.el7_9.aarch64
glibc-2.17-326.el7_9.aarch64


/etc/redhat-release
CentOS Linux release 7.6.1810 (AltArch)

both __linux__ and __aarch64__ is defined


May be is better to always include "asm/hwcap.h"?
or check HWCAP_CRC32 for pg_crc32c_armv8_choose.c and HWCAP_SVE
for pg_popcount_aarch64.c

Steven Niu <[email protected]> 于2025年11月17日周一 11:56写道:

> Hi, John,  Thomas,
>
> IvorySQL team found the same build issue on our building machine when we
> built IvorySQL code which is based on PG 18.0.
>
> pg_crc32c_armv8_choose.c:58:32:error:'HWCAP CRC32' undeclared(first use in
> this function)
>     58 | return (getauxval(AT_HWCAP) & HWCAP_CRC32) != θ;
>           |
>      ^~~~~~~~~~~
>
> Then we tried to build source code of PG 18.1 and got the same failure
> result.
>
>  I made some investigation to test the following code in
> src/port/pg_crc32c_armv8_choose.c
>
> +#if defined(HAVE_ELF_AUX_INFO) || defined(HAVE_GETAUXVAL)
> +#include <sys/auxv.h>
> +#if defined(__linux__) && !defined(__aarch64__) && !defined(HWCAP2_CRC32)
> +#include <asm/hwcap.h>
> +#endif
>
> // 1. Test defined(HAVE_ELF_AUX_INFO) || defined(HAVE_GETAUXVAL)
> // Got #warning "CONDITION IS FALSE"
> echo '#if defined(HAVE_ELF_AUX_INFO) || defined(HAVE_GETAUXVAL)
>     #warning "CONDITION IS TRUE"
>     #else
>     #warning "CONDITION IS FALSE"
>     #endif' | gcc -E -x c - -o -
>
> // 2. Test defined(__linux__)
> // Got true
> echo '#if defined(__linux__)
>     #warning "CONDITION IS TRUE"
>     #else
>     #warning "CONDITION IS FALSE"
>     #endif' | gcc -E -x c - -o -
>
> // 3. Test !defined(__aarch64__)
> // Got false
> echo '#if !defined(__aarch64__)
>     #warning "CONDITION IS TRUE"
>     #else
>     #warning "CONDITION IS FALSE"
>     #endif' | gcc -E -x c - -o -
>
> // Test  !defined(HWCAP2_CRC32)
> // Got true
> echo '#if !defined(HWCAP2_CRC32)
>     #warning "CONDITION IS TRUE"
>     #else
>     #warning "CONDITION IS FALSE"
>     #endif' | gcc -E -x c - -o -
>
>
> As a result, hwcap.h has no chance to be included in the building path.
>
> So, my question is, why we exclude __aarch64__ in the second #if
> condition?
>
> Thanks,
> Steven
>
> ------------------------------
> *From:* John Naylor <[email protected]>
> *Sent:* Friday, November 14, 2025 13:06
> *To:* 高增琦 <[email protected]>
> *Cc:* PostgreSQL Hackers <[email protected]>
> *Subject:* Re: Compile error on the aarch64 platform: Missing asm/hwcap.h
>
> On Fri, Nov 14, 2025 at 11:02 AM 高增琦 <[email protected]> wrote:
> > Compile error on CentOS Linux release 7.6.1810 (AltArch) with the
> message “‘HWCAP_CRC32’ undeclared”.
>
> We still have at least one CentOS 7 aarch64 machine that gets regular
> testing (not sure of the reason, since it's been EOL for a year and a
> half IIUC), and it builds fine:
>
>
> https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=arowana&dt=2025-11-04%2004%3A56%3A57
>
> > After modifying the code to add `include <asm/hwcap.h>`, the compilation
> succeeded.
>
> We already have the following, so I'm not sure what you mean (or even
> what architecture you're running on):
>
> #if defined(HAVE_ELF_AUX_INFO) || defined(HAVE_GETAUXVAL)
> #include <sys/auxv.h>
> #if defined(__linux__) && !defined(__aarch64__) && !defined(HWCAP2_CRC32)
> #include <asm/hwcap.h>
> #endif
> #endif
>
> --
> John Naylor
> Amazon Web Services
>
>
>

-- 
GaoZengqi
[email protected]
[email protected]

Reply via email to