diff --git a/Dockerfile b/Dockerfile index e2572ea..180a483 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,6 +11,12 @@ RUN apt-get update && \ gpsd gpsd-clients \ && rm -rf /var/lib/apt/lists/* +# Debian's libboost-all-dev is missing an #include in awaitable.hpp that current +# GCC/libstdc++ no longer pulls in transitively, breaking any C++20-coroutine-mode compile +# (e.g. UHD's rpclib) with "'exchange' is not a member of 'std'". Patch it in until Debian's +# packaged Boost picks up the upstream fix. +RUN sed -i '/#define BOOST_ASIO_AWAITABLE_HPP/a #include ' /usr/include/boost/asio/awaitable.hpp + # ---------------------------------------------------------------------------------------------------------------------------------------- # Build from sources # ---------------------------------------------------------------------------------------------------------------------------------------- @@ -56,6 +62,13 @@ RUN /usr/local/bin/uhd_images_downloader -t b2xx # SoapyUHD ADD https://github.com/pothosware/SoapyUHD.git /tmp/sources/SoapyUHD +# SoapyUHDDevice.cpp and UHDSoapyDevice.cpp both use boost::lexical_cast without including it +# directly, relying on a transitive include from a UHD header that no longer provides it. +RUN sed -i '/#include /i #include ' /tmp/sources/SoapyUHD/SoapyUHDDevice.cpp +RUN sed -i '/#include /a #include ' /tmp/sources/SoapyUHD/UHDSoapyDevice.cpp +# SoapyUHD pins itself to C++14, but current UHD's public headers (e.g. rfnoc/register_iface.hpp) +# use std::optional, which needs C++17+. Bump the standard it's built with to match. +RUN sed -i 's/set(CMAKE_CXX_STANDARD 14)/set(CMAKE_CXX_STANDARD 17)/' /tmp/sources/SoapyUHD/CMakeLists.txt WORKDIR /tmp/sources/SoapyUHD/build RUN cmake ../ RUN make -j$(nproc) @@ -82,15 +95,39 @@ RUN make install -j$(nproc) RUN ldconfig # ---------------------------------------------------------------------------------------------------------------------------------------- -# Add user +# Minimal runtime image: everything above is a full build toolchain (compilers, cmake, +# -dev packages, full source trees under /tmp/sources) that's only needed to produce the +# compiled artifacts, not to run them. Only the actual runtime pieces get copied out below. +# ---------------------------------------------------------------------------------------------------------------------------------------- +FROM jayfield/debian-baseimage AS final + +# Runtime-only equivalents of build_base's/build's -dev packages, derived by `ldd`-ing every +# compiled binary/module in the build stage and mapping the non-/usr/local .so's back to the +# packages that own them (see git history for the exact command). Anything not listed here +# comes in automatically as a transitive apt dependency of these. +RUN apt-get update && \ + apt-get -y install --no-install-recommends \ + openssh-server gpsd gpsd-clients \ + libavahi-client3 libusb-1.0-0 \ + libboost-chrono1.74.0 libboost-program-options1.74.0 libboost-serialization1.74.0 libboost-thread1.74.0 \ + && rm -rf /var/lib/apt/lists/* + RUN useradd -m jens -p jens -s /usr/bin/bash RUN echo jens:change_me | chpasswd RUN echo root:root4me | chpasswd - WORKDIR /home/jens RUN touch .Xauthority +# Compiled libraries/binaries (SoapySDR, SoapyRemote, UHD + its downloaded FPGA images, +# SoapyUHD, SoapySDRPlay) and the SDRplay API service + its udev rules for device recognition. +COPY --from=build /usr/local /usr/local +COPY --from=build /opt/sdrplay_api /opt/sdrplay_api +COPY --from=build /etc/udev/rules.d/66-sdrplay.rules /etc/udev/rules.d/66-sdrplay.rules +COPY --from=build /etc/udev/hwdb.d/20-sdrplay.hwdb /etc/udev/hwdb.d/20-sdrplay.hwdb +RUN ldconfig +ENV UHD_MODULE_PATH=/usr/local/lib/uhd/modules + # Copy scripts and configs ENV SCRIPTS_HOME=/opt/scripts ENV PATH=${PATH}:${SCRIPTS_HOME}