epics-base/p4p

p4p incompatible with NumPy 2.0

Opened this issue · 11 comments

On attempting to load p4p with the latest release of NumPy raises errors due to being compiled against the previous version.

File "src/p4p/_p4p.pyx", line 1, in init p4p._p4p
ValueError: numpy.dtype size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 from PyObject

Oh goody... Any idea how to accommodate both numpy 1.x and 2.x series without (somehow) doubling the .whl files?

fyi. the error comes from cython.

Unsure... @coretl might have some ideas...

I've done some digging and it looks like Numpy is pulling some magic under the covers to make 2.0 builds compatible with 1.* builds. They have a guide here, which seems to simply say that you build against 2.* and it'll work for 1.*. There's a caveat about what Python versions it may work with though; Numpy 2.0 is Python3.9+, so care will have to be taken to continue supporting older Python versions.

For reference, look at how scipy or Matplotlib are doing this.

For unsupported versions of Python (<=3.8) you will need to fallback to oldest-supported-numpy to build the wheels with a version of numpy that will work with any numpy that has a wheels for that Python version.

p4p now seems to require numpy 2.0. Is this intended? It appears to make p4p impossible to install.
From my latest attempts to install p4p:

67.85 The conflict is caused by:
67.85 The user requested numpy<1.23
67.85 p4p 3.5.0 depends on numpy>=2.0.1

This shows up in setup.py:

install_requires = [
        epicscorelibs.version.abi_requires(),
        pvxslibs.version.abi_requires(),
        # assume ABI forward compatibility as indicated by
        # https://github.com/numpy/numpy/blob/master/numpy/core/setup_common.py#L28
        'numpy >=%s'%numpy.version.short_version,
        'nose2>=0.8.0',
        'ply', # for asLib
    ]

I wonder if this is inheriting a numpy 2.0 dependence somehow?

Yep, the problem is here. The problem code appears to have been committed by @OCopping 10 hours ago.

@finnoshea Which version of python are you using? Which platform? Do you expect/want to use a pre-built wheel?

I think you are correct that the 'numpy >=%s'%numpy.version.short_version, dependency is now too strict post numpy 2.x.

The original logic was to build wheels against a fairly old numpy, which was in practice ABI compatible with newer versions at runtime.

For numpy 2.x, I'm not sure what the oldest backwards compatible version is wrt. ABI.

install_requires = [ ... ] # existing deps excluding numpy
if numpy.lib.NumpyVersion(numpy.__version__) >= '2.0.0b1':
    install_requires += ['numpy >= 1.7', 'numpy < 3']
else:
    install_requires += ['numpy >=%s'%numpy.version.short_version, 'numpy < 2']

I pick 1.7 somewhat arbitrarily. I think that whichever version is picked will probably need to inject eg. :

#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION

Please read the manual ...

I did last month, and I have again now. I admit that I was confusing the existing NPY_NO_DEPRECATED_API with the new NPY_TARGET_VERSION macro. So the answer to my question of what the oldest possible backwards compatible version for 2.x builds is in fact 1.7.

https://github.com/numpy/numpy/blob/97ac25534b359f35e690df49696405462abd9909/numpy/_core/include/numpy/numpyconfig.h#L64

This document does not address also supporting source builds against 1.x, which I think P4P needs to support. So I think the condition I wrote above will be necessary, with the addition of defining the per-processor macro NPY_TARGET_VERSION to NPY_1_7_API_VERSION.

Apologies for the verbose dump in this comment. I've been trying to install p4p in a Docker container.

Here is the Dockerfile I inherited:

ARG PYTHON_VERSION=3.10-slim-bullseye

FROM python:${PYTHON_VERSION}

SHELL ["/bin/bash", "-c"]
ARG DEBIAN_FRONTEND=noninteractive
ENV PYTHONFAULTHANDLER=1 \
    PYTHONUNBUFFERED=1 \
    PYTHONHASHSEED=random \
    PIP_NO_CACHE_DIR=off \
    PIP_DISABLE_PIP_VERSION_CHECK=on \
    PIP_DEFAULT_TIMEOUT=100

# Install build dependencies
RUN apt-get update \
    && apt-get install -y --no-install-recommends build-essential curl git vim poppler-utils pkg-config libhdf5-serial-dev \
    && apt-get autoremove -y \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Install poetry as package manager
#ENV POETRY_HOME="/opt/poetry" \
#    POETRY_VIRTUALENVS_IN_PROJECT=1 \
#    POETRY_NO_INTERACTION=1
#ARG POETRY_VERSION=1.4.1
#RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=${POETRY_HOME} POETRY_VERSION=${POETRY_VERSION} python3 -

# Setup venv
RUN python3 -m venv /opt/venv
RUN pip3 install --upgrade pip setuptools wheel

# Install packages
#ENV PATH="/opt/venv/bin:$POETRY_HOME/bin:$PATH"

WORKDIR /opt/SLAC-AD
RUN source /opt/venv/bin/activate
#COPY pyproject.toml poetry.lock ./
RUN source /opt/venv/bin/activate
#RUN poetry config virtualenvs.create false \
#    && poetry install --no-interaction --no-ansi --no-root

COPY requirements.txt ./
RUN pip3 install -r requirements.txt
COPY p4p_reqs.txt ./
RUN pip3 install -r p4p_reqs.txt

#ADD p4p_install /opt/p4p
#RUN pip3 install epicscorelibs pvxslibs /opt/p4p  

# Set env var needed to load EPICS data (as expected by the meme/p4p packages)
# Valid only on machines where mccas0 is a known alias
ENV EPICS_PVA_ADDR_LIST=mccas0

# Set env var needed to load BSA data
# Requires the BSA data directory to be mounted to this path
ENV BSA_DATA_DIR=/opt/data/bsa

# Set env var to project home
# Requires the project home directory to be mounted to this path
ENV PROJECT_HOME=/opt/project

WORKDIR /opt/SLAC-AD

I've had to excise the poetry stuff from there, because it does not play well with pytorch. The two files of interest to you are requirements.txt:

colorama #==0.4.6 ; python_version >= "3.10" and python_version < "3.11" and platform_system == "Windows"
#epicscorelibs==7.0.7.99.1.1a2  #==7.0.7.99.0.2 ; python_version >= "3.10" and python_version < "3.11"
h5py  #==3.11.0 ; python_version >= "3.10" and python_version < "3.11"
joblib  #==1.4.2 ; python_version >= "3.10" and python_version < "3.11"
kaleido  #==0.2.1 ; python_version >= "3.10" and python_version < "3.11"
llvmlite  #==0.39.1 ; python_version >= "3.10" and python_version < "3.11"
#meme @ git+https://github.com/slaclab/meme@af07afe431fa4503664aca8d9f83f786f85abbf0 ; python_version >= "3.10" and python_version < "3.11"
#nose2  #==0.15.1 ; python_version >= "3.10" and python_version < "3.11"
numba  #==0.56.4 ; python_version >= "3.10" and python_version < "3.11"
numpy  #==1.23.5 ; python_version >= "3.10" and python_version < "3.11"
#p4p  #4.1.12 ; python_version >= "3.10" and python_version < "3.11"
packaging  #==24.1 ; python_version >= "3.10" and python_version < "3.11"
pandas  #==1.5.3 ; python_version >= "3.10" and python_version < "3.11"
plotly  #==5.23.0 ; python_version >= "3.10" and python_version < "3.11"
ply  #==3.11 ; python_version >= "3.10" and python_version < "3.11"
#pvxslibs  #==1.3.1 ; python_version >= "3.10" and python_version < "3.11"
pynndescent  #==0.5.13 ; python_version >= "3.10" and python_version < "3.11"
python-dateutil  #==2.9.0.post0 ; python_version >= "3.10" and python_version < "3.11"
pytz  #==2022.7.1 ; python_version >= "3.10" and python_version < "3.11"
scikit-learn  #==1.5.1 ; python_version >= "3.10" and python_version < "3.11"
scipy  #==1.14.0 ; python_version >= "3.10" and python_version < "3.11"
setuptools-dso  #==2.10 ; python_version >= "3.10" and python_version < "3.11"
setuptools  #==72.2.0 ; python_version >= "3.10" and python_version < "3.11"
six  #==1.16.0 ; python_version >= "3.10" and python_version < "3.11"
tenacity  #==9.0.0 ; python_version >= "3.10" and python_version < "3.11"
threadpoolctl  #==3.5.0 ; python_version >= "3.10" and python_version < "3.11"
tqdm  #==4.66.5 ; python_version >= "3.10" and python_version < "3.11"
umap-learn  #==0.5.6 ; python_version >= "3.10" and python_version < "3.11"
xlrd  #==2.0.1 ; python_version >= "3.10" and python_version < "3.11"

and p4p_reqs.txt:

epicscorelibs
meme @ git+https://github.com/slaclab/meme@af07afe431fa4503664aca8d9f83f786f85abbf0 ; python_version >= "3.10" and python_version < "3.11"
nose2  #==0.15.1 ; python_version >= "3.10" and python_version < "3.11"
p4p  #4.1.12 ; python_version >= "3.10" and python_version < "3.11"

Below is the error I get when trying to pip3 install p4p_reqs.txt. I get the same error with 3.11-slim-bullseye as the base. If I limit numpy to numpy<1.23, it appears to download 2.0.1 anyway and then I get the same error.

0.207 Collecting meme@ git+https://github.com/slaclab/meme@af07afe431fa4503664aca8d9f83f786f85abbf0 (from -r p4p_reqs.txt (line 2))                                                                                                                  
0.208   Cloning https://github.com/slaclab/meme (to revision af07afe431fa4503664aca8d9f83f786f85abbf0) to /tmp/pip-install-12gmrgwt/meme_66b649dcaeb54ab2ab297066b8f9da80                                                                            
0.208   Running command git clone --filter=blob:none --quiet https://github.com/slaclab/meme /tmp/pip-install-12gmrgwt/meme_66b649dcaeb54ab2ab297066b8f9da80                                                                                         
1.209   Running command git rev-parse -q --verify 'sha^af07afe431fa4503664aca8d9f83f786f85abbf0'                                                                                                                                                     
1.210   Running command git fetch -q https://github.com/slaclab/meme af07afe431fa4503664aca8d9f83f786f85abbf0
1.483   Running command git checkout -q af07afe431fa4503664aca8d9f83f786f85abbf0
1.831   Resolved https://github.com/slaclab/meme to commit af07afe431fa4503664aca8d9f83f786f85abbf0
1.835   Preparing metadata (setup.py): started
1.944   Preparing metadata (setup.py): finished with status 'done'
2.118 Collecting epicscorelibs (from -r p4p_reqs.txt (line 1))
2.227   Downloading epicscorelibs-7.0.7.99.0.2.tar.gz (1.6 MB)
2.289      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 116.5 MB/s eta 0:00:00
2.432   Installing build dependencies: started
3.266   Installing build dependencies: finished with status 'done'
3.267   Getting requirements to build wheel: started
3.405   Getting requirements to build wheel: finished with status 'done'
3.406   Preparing metadata (pyproject.toml): started
3.529   Preparing metadata (pyproject.toml): finished with status 'done'
3.542 Collecting nose2 (from -r p4p_reqs.txt (line 3))
3.548   Downloading nose2-0.15.1-py3-none-any.whl.metadata (7.3 kB)
3.613 Collecting p4p (from -r p4p_reqs.txt (line 4))
3.624   Downloading p4p-4.1.12.tar.gz (110 kB)
3.649   Installing build dependencies: started
60.98   Installing build dependencies: finished with status 'done'
60.98   Getting requirements to build wheel: started
62.21   Getting requirements to build wheel: finished with status 'done'
62.21   Preparing metadata (pyproject.toml): started
62.54   Preparing metadata (pyproject.toml): finished with status 'done'
62.54 Requirement already satisfied: setuptools in /usr/local/lib/python3.10/site-packages (from epicscorelibs->-r p4p_reqs.txt (line 1)) (72.2.0)
62.54 Requirement already satisfied: setuptools-dso>=2.9a1 in /usr/local/lib/python3.10/site-packages (from epicscorelibs->-r p4p_reqs.txt (line 1)) (2.10)
62.54 Requirement already satisfied: numpy in /usr/local/lib/python3.10/site-packages (from epicscorelibs->-r p4p_reqs.txt (line 1)) (1.22.4)
62.54 Requirement already satisfied: pandas in /usr/local/lib/python3.10/site-packages (from meme@ git+https://github.com/slaclab/meme@af07afe431fa4503664aca8d9f83f786f85abbf0->-r p4p_reqs.txt (line 2)) (2.2.2)
62.55 Collecting epicscorelibs (from -r p4p_reqs.txt (line 1))
62.55   Downloading epicscorelibs-7.0.7.99.1.1a2.tar.gz (1.6 MB)
62.62      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 25.7 MB/s eta 0:00:00
62.75   Installing build dependencies: started
63.59   Installing build dependencies: finished with status 'done'
63.59   Getting requirements to build wheel: started
63.73   Getting requirements to build wheel: finished with status 'done'
63.73   Preparing metadata (pyproject.toml): started
63.87   Preparing metadata (pyproject.toml): finished with status 'done'
63.91 Collecting pvxslibs<1.4.0a1,>=1.3.1 (from p4p->-r p4p_reqs.txt (line 4))
63.92   Downloading pvxslibs-1.3.1.tar.gz (660 kB)
63.95      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 660.3/660.3 kB 27.8 MB/s eta 0:00:00
63.99   Installing build dependencies: started
87.24   Installing build dependencies: finished with status 'done'
87.24   Getting requirements to build wheel: started
87.34   Getting requirements to build wheel: finished with status 'done'
87.34   Preparing metadata (pyproject.toml): started
87.44   Preparing metadata (pyproject.toml): finished with status 'done'
87.53 Collecting numpy (from epicscorelibs->-r p4p_reqs.txt (line 1))
87.53   Downloading numpy-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (62 kB)
87.54 Requirement already satisfied: ply in /usr/local/lib/python3.10/site-packages (from p4p->-r p4p_reqs.txt (line 4)) (3.11)
87.56 Collecting setuptools-dso>=2.11a2 (from epicscorelibs->-r p4p_reqs.txt (line 1))
87.56   Downloading setuptools_dso-2.11a2-py2.py3-none-any.whl.metadata (1.6 kB)
87.58 Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/site-packages (from pandas->meme@ git+https://github.com/slaclab/meme@af07afe431fa4503664aca8d9f83f786f85abbf0->-r p4p_reqs.txt (line 2)) (2.9.0.post0)
87.58 Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/site-packages (from pandas->meme@ git+https://github.com/slaclab/meme@af07afe431fa4503664aca8d9f83f786f85abbf0->-r p4p_reqs.txt (line 2)) (2024.1)
87.58 Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/site-packages (from pandas->meme@ git+https://github.com/slaclab/meme@af07afe431fa4503664aca8d9f83f786f85abbf0->-r p4p_reqs.txt (line 2)) (2024.1)
87.58 Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/site-packages (from python-dateutil>=2.8.2->pandas->meme@ git+https://github.com/slaclab/meme@af07afe431fa4503664aca8d9f83f786f85abbf0->-r p4p_reqs.txt (line 2)) (1.16.0)
87.59 Downloading nose2-0.15.1-py3-none-any.whl (211 kB)
87.60 Downloading numpy-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (13.9 MB)
88.05    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.9/13.9 MB 31.6 MB/s eta 0:00:00
88.06 Downloading setuptools_dso-2.11a2-py2.py3-none-any.whl (23 kB)
88.09 Building wheels for collected packages: meme, p4p, epicscorelibs, pvxslibs
88.09   Building wheel for meme (setup.py): started
88.21   Building wheel for meme (setup.py): finished with status 'done'
88.21   Created wheel for meme: filename=meme-0.7.0-py3-none-any.whl size=17432 sha256=6a358a00f3e92a0a08ab9fe8c5311d109ba573690de60d3d5872534cf6308afd
88.21   Stored in directory: /tmp/pip-ephem-wheel-cache-p78zn6r9/wheels/09/cf/97/1bd7c844fc10fb8547d0072a9008a65cfaacf2858ff43489cd
88.21   Building wheel for p4p (pyproject.toml): started
92.49   Building wheel for p4p (pyproject.toml): finished with status 'error'
92.49   error: subprocess-exited-with-error
92.49   
92.49   × Building wheel for p4p (pyproject.toml) did not run successfully.
92.49   │ exit code: 1
92.49   ╰─> [88 lines of output]
92.49       <string>:11: DeprecationWarning:
92.49       
92.49         `numpy.distutils` is deprecated since NumPy 1.23.0, as a result
92.49         of the deprecation of `distutils` itself. It will be removed for
92.49         Python >= 3.12. For older Python versions it will remain present.
92.49         It is recommended to use `setuptools < 60.0` for those Python versions.
92.49         For more details, see:
92.49           https://numpy.org/devdocs/reference/distutils_status_migration.html
92.49       
92.49       
92.49       running bdist_wheel
92.49       running build
92.49       running build_py
92.49       creating build
92.49       creating build/lib.linux-aarch64-cpython-310
92.49       creating build/lib.linux-aarch64-cpython-310/p4p
92.49       copying src/p4p/gw.py -> build/lib.linux-aarch64-cpython-310/p4p
92.49       copying src/p4p/disect.py -> build/lib.linux-aarch64-cpython-310/p4p
92.49       copying src/p4p/__init__.py -> build/lib.linux-aarch64-cpython-310/p4p
92.49       copying src/p4p/rpc.py -> build/lib.linux-aarch64-cpython-310/p4p
92.49       copying src/p4p/util.py -> build/lib.linux-aarch64-cpython-310/p4p
92.49       copying src/p4p/version.py -> build/lib.linux-aarch64-cpython-310/p4p
92.49       copying src/p4p/wrapper.py -> build/lib.linux-aarch64-cpython-310/p4p
92.49       creating build/lib.linux-aarch64-cpython-310/p4p/nt
92.49       copying src/p4p/nt/__init__.py -> build/lib.linux-aarch64-cpython-310/p4p/nt
92.49       copying src/p4p/nt/ndarray.py -> build/lib.linux-aarch64-cpython-310/p4p/nt
92.49       copying src/p4p/nt/scalar.py -> build/lib.linux-aarch64-cpython-310/p4p/nt
92.49       copying src/p4p/nt/common.py -> build/lib.linux-aarch64-cpython-310/p4p/nt
92.49       copying src/p4p/nt/enum.py -> build/lib.linux-aarch64-cpython-310/p4p/nt
92.49       creating build/lib.linux-aarch64-cpython-310/p4p/client
92.49       copying src/p4p/client/__init__.py -> build/lib.linux-aarch64-cpython-310/p4p/client
92.49       copying src/p4p/client/cli.py -> build/lib.linux-aarch64-cpython-310/p4p/client
92.49       copying src/p4p/client/thread.py -> build/lib.linux-aarch64-cpython-310/p4p/client
92.49       copying src/p4p/client/Qt.py -> build/lib.linux-aarch64-cpython-310/p4p/client
92.49       copying src/p4p/client/asyncio.py -> build/lib.linux-aarch64-cpython-310/p4p/client
92.49       copying src/p4p/client/cothread.py -> build/lib.linux-aarch64-cpython-310/p4p/client
92.49       copying src/p4p/client/raw.py -> build/lib.linux-aarch64-cpython-310/p4p/client
92.49       creating build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/test_nt.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/test_asyncio.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/asynciotest.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/__init__.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/qttest.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/test_server.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/test_sharedpv.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/test_rpc.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/test_type.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/test_gw.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/test_asLib.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/test_cothread.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/cothreadtest.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/test_value.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/test_client_raw.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/utils.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/test_qt.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       copying src/p4p/test/test_client_thread.py -> build/lib.linux-aarch64-cpython-310/p4p/test
92.49       creating build/lib.linux-aarch64-cpython-310/p4p/server
92.49       copying src/p4p/server/__init__.py -> build/lib.linux-aarch64-cpython-310/p4p/server
92.49       copying src/p4p/server/cli.py -> build/lib.linux-aarch64-cpython-310/p4p/server
92.49       copying src/p4p/server/thread.py -> build/lib.linux-aarch64-cpython-310/p4p/server
92.49       copying src/p4p/server/asyncio.py -> build/lib.linux-aarch64-cpython-310/p4p/server
92.49       copying src/p4p/server/cothread.py -> build/lib.linux-aarch64-cpython-310/p4p/server
92.49       copying src/p4p/server/raw.py -> build/lib.linux-aarch64-cpython-310/p4p/server
92.49       creating build/lib.linux-aarch64-cpython-310/p4p/asLib
92.49       copying src/p4p/asLib/lex.py -> build/lib.linux-aarch64-cpython-310/p4p/asLib
92.49       copying src/p4p/asLib/yacc.py -> build/lib.linux-aarch64-cpython-310/p4p/asLib
92.49       copying src/p4p/asLib/__init__.py -> build/lib.linux-aarch64-cpython-310/p4p/asLib
92.49       copying src/p4p/asLib/pvlist.py -> build/lib.linux-aarch64-cpython-310/p4p/asLib
92.49       copying src/p4p/example.conf -> build/lib.linux-aarch64-cpython-310/p4p
92.49       copying src/p4p/pvagw@.service -> build/lib.linux-aarch64-cpython-310/p4p
92.49       running build_ext
92.49       building 'p4p._p4p' extension
92.49       Warning: Can't read registry to find the necessary compiler setting
92.49       Make sure that Python modules winreg, win32api or win32con are installed.
92.49       INFO: C compiler: gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC
92.49       
92.49       creating build/temp.linux-aarch64-cpython-310
92.49       creating build/temp.linux-aarch64-cpython-310/src
92.49       creating build/temp.linux-aarch64-cpython-310/src/p4p
92.49       INFO: compile options: '-D_GNU_SOURCE -D_DEFAULT_SOURCE -Dlinux -DUNIX -D_GLIBCXX_USE_CXX11_ABI=1 -D__PYX_EXTERN_C=extern -DPY_ARRAY_UNIQUE_SYMBOL=PVXS_PyArray_API -DPVXS_ENABLE_EXPERT_API -I/tmp/pip-build-env-yhvusxpq/overlay/lib/python3.10/site-packages/numpy/_core/include -I/tmp/pip-build-env-yhvusxpq/overlay/lib/python3.10/site-packages/epicscorelibs/include -I/tmp/pip-build-env-yhvusxpq/overlay/lib/python3.10/site-packages/pvxslibs/include -Isrc -Isrc/p4p -I/usr/local/include/python3.10 -c'
92.49       extra options: '-g0 -std=c++11'
92.49       INFO: gcc: src/p4p/_p4p.cpp
92.49       INFO: gcc: src/pvxs_client.cpp
92.49       INFO: gcc: src/pvxs_sharedpv.cpp
92.49       INFO: gcc: src/pvxs_source.cpp
92.49       INFO: gcc: src/pvxs_type.cpp
92.49       INFO: gcc: src/pvxs_value.cpp
92.49       error: Command "gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -D_GNU_SOURCE -D_DEFAULT_SOURCE -Dlinux -DUNIX -D_GLIBCXX_USE_CXX11_ABI=1 -D__PYX_EXTERN_C=extern -DPY_ARRAY_UNIQUE_SYMBOL=PVXS_PyArray_API -DPVXS_ENABLE_EXPERT_API -I/tmp/pip-build-env-yhvusxpq/overlay/lib/python3.10/site-packages/numpy/_core/include -I/tmp/pip-build-env-yhvusxpq/overlay/lib/python3.10/site-packages/epicscorelibs/include -I/tmp/pip-build-env-yhvusxpq/overlay/lib/python3.10/site-packages/pvxslibs/include -Isrc -Isrc/p4p -I/usr/local/include/python3.10 -c src/pvxs_value.cpp -o build/temp.linux-aarch64-cpython-310/src/pvxs_value.o -g0 -std=c++11" failed with exit status 1
92.49       [end of output]
92.49   
92.49   note: This error originates from a subprocess, and is likely not a problem with pip.
92.49   ERROR: Failed building wheel for p4p
92.49   Building wheel for epicscorelibs (pyproject.toml): started
111.7   Building wheel for epicscorelibs (pyproject.toml): finished with status 'done'
111.7   Created wheel for epicscorelibs: filename=epicscorelibs-7.0.7.99.1.1a2-cp310-cp310-linux_aarch64.whl size=5074916 sha256=48c1a2e610bb9c1aaf55ef8479f4e1d1a8d126e778fa68fdf33b22764b25d72c
111.7   Stored in directory: /tmp/pip-ephem-wheel-cache-p78zn6r9/wheels/d4/8b/22/f36a826f9e51101328b7af1e32bcdc10a020bb4adf23564851
111.7   Building wheel for pvxslibs (pyproject.toml): started
121.4   Building wheel for pvxslibs (pyproject.toml): finished with status 'done'
121.4   Created wheel for pvxslibs: filename=pvxslibs-1.3.1-cp310-cp310-linux_aarch64.whl size=2441106 sha256=96afddbe0de298287a8d9fb81bdb36eb56f4de595ba65fa97fc80e72149c8f4b
121.4   Stored in directory: /tmp/pip-ephem-wheel-cache-p78zn6r9/wheels/7e/f4/76/05f2f0bc6dfafa9355714578b7683c6e38a4ea4c4fb9bcd7ca
121.4 Successfully built meme epicscorelibs pvxslibs
121.4 Failed to build p4p

I've tried cloning the p4p repo and adjusting the contents of setup.py and pyproject.toml, but then I run into incompatibility issues with pvxslibs. I don't know how necessary those required dependencies are, so I don't want to just bulldoze through them all.

At the risk of commenting too much, when I change pyproject.toml to be

[build-system]
requires = [
    "setuptools",
    "setuptools_dso>=2.7a1,<=2.10; python_version<='3.11'",
    "setuptools_dso>=2.11a2; python_version>='3.12'",
    "wheel",
    "numpy",
    #"numpy>=2.0.1; python_version>='3.10'",
    "numpy<1.23; python_version>='3.10'",
    "Cython>=0.20",
    #"epicscorelibs==7.0.7.99.0.2; python_version<='3.11'",
    #"epicscorelibs>=7.0.7.99.1.1a2; python_version>='3.12'",
    "pvxslibs==1.3.1; python_version<='3.11'",
    "pvxslibs>=1.3.2a1; python_version>='3.12'",
]

in a cloned repo, I get the following error:

0.202 Processing /opt/p4p                                                                                                                                                                                                                             
0.203   Installing build dependencies: started                                                                                                                                                                                                        
25.19   Installing build dependencies: finished with status 'error'                                                                                                                                                                                   
25.19   error: subprocess-exited-with-error                                                                                                                                                                                                           
25.19   
25.19   × pip subprocess to install build dependencies did not run successfully.
25.19   │ exit code: 1
25.19   ╰─> [44 lines of output]
25.19       Ignoring setuptools_dso: markers 'python_version >= "3.12"' don't match your environment
25.19       Ignoring pvxslibs: markers 'python_version >= "3.12"' don't match your environment
25.19       Collecting setuptools
25.19         Downloading setuptools-72.2.0-py3-none-any.whl.metadata (6.6 kB)
25.19       Collecting setuptools_dso<=2.10,>=2.7a1
25.19         Downloading setuptools_dso-2.10-py2.py3-none-any.whl.metadata (1.6 kB)
25.19       Collecting wheel
25.19         Downloading wheel-0.44.0-py3-none-any.whl.metadata (2.3 kB)
25.19       Collecting numpy
25.19         Downloading numpy-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (62 kB)
25.19         Downloading numpy-1.22.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (2.0 kB)
25.19       Collecting Cython>=0.20
25.19         Downloading Cython-3.0.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (3.2 kB)
25.19       Collecting pvxslibs==1.3.1
25.19         Downloading pvxslibs-1.3.1.tar.gz (660 kB)
25.19            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 660.3/660.3 kB 28.9 MB/s eta 0:00:00
25.19         Installing build dependencies: started
25.19         Installing build dependencies: finished with status 'done'
25.19         Getting requirements to build wheel: started
25.19         Getting requirements to build wheel: finished with status 'done'
25.19         Preparing metadata (pyproject.toml): started
25.19         Preparing metadata (pyproject.toml): finished with status 'done'
25.19       Collecting epicscorelibs<7.0.7.99.2,>=7.0.7.99.1.1a2 (from pvxslibs==1.3.1)
25.19         Downloading epicscorelibs-7.0.7.99.1.1a2.tar.gz (1.6 MB)
25.19            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 29.8 MB/s eta 0:00:00
25.19         Installing build dependencies: started
25.19         Installing build dependencies: finished with status 'done'
25.19         Getting requirements to build wheel: started
25.19         Getting requirements to build wheel: finished with status 'done'
25.19         Preparing metadata (pyproject.toml): started
25.19         Preparing metadata (pyproject.toml): finished with status 'done'
25.19       INFO: pip is looking at multiple versions of epicscorelibs to determine which version is compatible with other requirements. This could take a while.
25.19       ERROR: Cannot install pvxslibs, pvxslibs==1.3.1 and setuptools_dso<=2.10 and >=2.7a1 because these package versions have conflicting dependencies.
25.19       
25.19       The conflict is caused by:
25.19           The user requested setuptools_dso<=2.10 and >=2.7a1
25.19           pvxslibs 1.3.1 depends on setuptools-dso>=2.7a1
25.19           epicscorelibs 7.0.7.99.1.1a2 depends on setuptools-dso>=2.11a2
25.19       
25.19       To fix this you could try to:
25.19       1. loosen the range of package versions you've specified
25.19       2. remove package versions to allow pip to attempt to solve the dependency conflict
25.19       
25.19       ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-with-dependency-conflicts
25.19       [end of output]
25.19   
25.19   note: This error originates from a subprocess, and is likely not a problem with pip.
25.19 error: subprocess-exited-with-error
25.19 
25.19 × pip subprocess to install build dependencies did not run successfully.
25.19 │ exit code: 1
25.19 ╰─> See above for output.
25.19 
25.19 note: This error originates from a subprocess, and is likely not a problem with pip.

Apologies for the verbose dump ...

This verbosity can be avoided by attaching as a text file.