diff --git a/.github/workflows/amd64_docker_cmake.yml b/.github/workflows/amd64_docker_cmake.yml index d96a34ad11..f9aa710a47 100644 --- a/.github/workflows/amd64_docker_cmake.yml +++ b/.github/workflows/amd64_docker_cmake.yml @@ -7,7 +7,7 @@ jobs: cmake: strategy: matrix: - distro: [alpine, archlinux, centos, debian, fedora, opensuse, ubuntu] + distro: [almalinux, alpine, archlinux, debian, fedora, opensuse, rockylinux, ubuntu] lang: [cpp, python, dotnet, java] fail-fast: false name: ${{ matrix.distro }} • CMake • ${{ matrix.lang }} diff --git a/.github/workflows/amd64_windows_cmake_dotnet.yml b/.github/workflows/amd64_windows_cmake_dotnet.yml index 9df698847b..e5b676f5a7 100644 --- a/.github/workflows/amd64_windows_cmake_dotnet.yml +++ b/.github/workflows/amd64_windows_cmake_dotnet.yml @@ -16,15 +16,15 @@ jobs: runs-on: windows-latest steps: - uses: actions/checkout@v4 - - name: Install SWIG 4.1.1 + - name: Install SWIG 4.2.1 run: | - (New-Object System.Net.WebClient).DownloadFile("http://prdownloads.sourceforge.net/swig/swigwin-4.1.1.zip","swigwin-4.1.1.zip"); - Expand-Archive .\swigwin-4.1.1.zip .; - echo "$((Get-Item .).FullName)/swigwin-4.1.1" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + (New-Object System.Net.WebClient).DownloadFile("http://prdownloads.sourceforge.net/swig/swigwin-4.2.1.zip","swigwin-4.2.1.zip"); + Expand-Archive .\swigwin-4.2.1.zip .; + echo "$((Get-Item .).FullName)/swigwin-4.2.1" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: Check swig run: swig -version - name: Setup .NET 6.0 - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: 6.0.x - name: Check dotnet diff --git a/.github/workflows/amd64_windows_cmake_java.yml b/.github/workflows/amd64_windows_cmake_java.yml index f1ac34155f..2426572055 100644 --- a/.github/workflows/amd64_windows_cmake_java.yml +++ b/.github/workflows/amd64_windows_cmake_java.yml @@ -16,11 +16,11 @@ jobs: runs-on: windows-latest steps: - uses: actions/checkout@v4 - - name: Install SWIG 4.1.1 + - name: Install SWIG 4.2.1 run: | - (New-Object System.Net.WebClient).DownloadFile("http://prdownloads.sourceforge.net/swig/swigwin-4.1.1.zip","swigwin-4.1.1.zip"); - Expand-Archive .\swigwin-4.1.1.zip .; - echo "$((Get-Item .).FullName)/swigwin-4.1.1" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + (New-Object System.Net.WebClient).DownloadFile("http://prdownloads.sourceforge.net/swig/swigwin-4.2.1.zip","swigwin-4.2.1.zip"); + Expand-Archive .\swigwin-4.2.1.zip .; + echo "$((Get-Item .).FullName)/swigwin-4.2.1" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: Check swig run: swig -version - name: Check java diff --git a/.github/workflows/amd64_windows_cmake_python.yml b/.github/workflows/amd64_windows_cmake_python.yml index 8f40e36d05..1126ab356d 100644 --- a/.github/workflows/amd64_windows_cmake_python.yml +++ b/.github/workflows/amd64_windows_cmake_python.yml @@ -27,11 +27,11 @@ jobs: python-version: ${{ matrix.python.version }} - name: Install python3 run: python3 -m pip install --user mypy-protobuf absl-py setuptools wheel numpy pandas - - name: Install SWIG 4.1.1 + - name: Install SWIG 4.2.1 run: | - (New-Object System.Net.WebClient).DownloadFile("http://prdownloads.sourceforge.net/swig/swigwin-4.1.1.zip","swigwin-4.1.1.zip"); - Expand-Archive .\swigwin-4.1.1.zip .; - echo "$((Get-Item .).FullName)/swigwin-4.1.1" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + (New-Object System.Net.WebClient).DownloadFile("http://prdownloads.sourceforge.net/swig/swigwin-4.2.1.zip","swigwin-4.2.1.zip"); + Expand-Archive .\swigwin-4.2.1.zip .; + echo "$((Get-Item .).FullName)/swigwin-4.2.1" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: Check swig run: swig -version - name: Add Python binaries to path diff --git a/cmake/Makefile b/cmake/Makefile index d1044fc80b..be129cacd1 100644 --- a/cmake/Makefile +++ b/cmake/Makefile @@ -38,12 +38,13 @@ help: @echo -e "\t${BOLD}clean__${RESET}: Remove a docker image for a specific distro." @echo @echo -e "\tWith ${BOLD}${RESET}:" + @echo -e "\t\t${BOLD}almalinux${RESET} (latest)" @echo -e "\t\t${BOLD}alpine${RESET} (edge)" @echo -e "\t\t${BOLD}archlinux${RESET} (latest)" - @echo -e "\t\t${BOLD}centos${RESET} (latest)" @echo -e "\t\t${BOLD}debian${RESET} (latest)" @echo -e "\t\t${BOLD}fedora${RESET} (latest)" @echo -e "\t\t${BOLD}opensuse${RESET} (tumbleweed)" + @echo -e "\t\t${BOLD}rockylinux${RESET} (9)" @echo -e "\t\t${BOLD}ubuntu${RESET} (rolling)" @echo -e "\t\t${BOLD}system_deps${RESET} (archlinux with all deps from pacman)" @echo -e "\t\t${BOLD}all${RESET}: ALL DISTROS" @@ -187,7 +188,16 @@ endif DOCKER_RUN_CMD := docker run --rm --init --net=host # Currently supported distro -DISTROS := alpine archlinux centos debian fedora opensuse ubuntu system_deps +DISTROS := \ + almalinux \ + alpine \ + archlinux \ + debian \ + fedora \ + opensuse \ + rockylinux \ + ubuntu \ + system_deps # $* stem # $< first prerequist diff --git a/cmake/README.md b/cmake/README.md index 89b3776cf2..9973076d90 100644 --- a/cmake/README.md +++ b/cmake/README.md @@ -43,11 +43,11 @@ Dockers \[Alpine, Archlinux, Centos, Debian, Fedora, OpenSuse, Ubuntu\]x [![Build Status][mips_toolchain_status]][mips_toolchain_link] [![Build Status][powerpc_toolchain_status]][powerpc_toolchain_link] -[aarch64_toolchain_status]: ./../../../actions/workflows/aarch64_toolchain.yml/badge.svg +[aarch64_toolchain_status]: ./../../../actions/workflows/aarch64_toolchain.yml/badge.svg?branch=main [aarch64_toolchain_link]: ./../../../actions/workflows/aarch64_toolchain.yml -[mips_toolchain_status]: ./../../../actions/workflows/mips_toolchain.yml/badge.svg +[mips_toolchain_status]: ./../../../actions/workflows/mips_toolchain.yml/badge.svg?branch=main [mips_toolchain_link]: ./../../../actions/workflows/mips_toolchain.yml -[powerpc_toolchain_status]: ./../../../actions/workflows/powerpc_toolchain.yml/badge.svg +[powerpc_toolchain_status]: ./../../../actions/workflows/powerpc_toolchain.yml/badge.svg?branch=main [powerpc_toolchain_link]: ./../../../actions/workflows/powerpc_toolchain.yml ## Introduction diff --git a/cmake/docker/almalinux/Dockerfile b/cmake/docker/almalinux/Dockerfile new file mode 100644 index 0000000000..4a1268f642 --- /dev/null +++ b/cmake/docker/almalinux/Dockerfile @@ -0,0 +1,27 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/almalinux +FROM almalinux:latest AS base +# Install system build dependencies +ENV PATH=/usr/local/bin:$PATH +RUN dnf -y update \ +&& dnf -y install git wget openssl-devel cmake \ +&& dnf -y groupinstall "Development Tools" \ +&& dnf clean all \ +&& rm -rf /var/cache/dnf +CMD [ "/usr/bin/bash" ] + +# Install SWIG 4.2.1 +FROM base AS swig +RUN dnf -y update \ +&& dnf -y install pcre2-devel \ +&& dnf clean all \ +&& rm -rf /var/cache/dnf \ +&& wget -q "https://downloads.sourceforge.net/project/swig/swig/swig-4.2.1/swig-4.2.1.tar.gz" \ +&& tar xvf swig-4.2.1.tar.gz \ +&& rm swig-4.2.1.tar.gz \ +&& cd swig-4.2.1 \ +&& ./configure --prefix=/usr \ +&& make -j 4 \ +&& make install \ +&& cd .. \ +&& rm -rf swig-4.2.1 diff --git a/cmake/docker/centos/cpp.Dockerfile b/cmake/docker/almalinux/cpp.Dockerfile similarity index 94% rename from cmake/docker/centos/cpp.Dockerfile rename to cmake/docker/almalinux/cpp.Dockerfile index 36a302dea3..d98d1b4220 100644 --- a/cmake/docker/centos/cpp.Dockerfile +++ b/cmake/docker/almalinux/cpp.Dockerfile @@ -1,4 +1,4 @@ -FROM ortools/cmake:centos_base AS env +FROM ortools/cmake:almalinux_base AS env RUN cmake -version FROM env AS devel diff --git a/cmake/docker/centos/dotnet.Dockerfile b/cmake/docker/almalinux/dotnet.Dockerfile similarity index 68% rename from cmake/docker/centos/dotnet.Dockerfile rename to cmake/docker/almalinux/dotnet.Dockerfile index 0764f086ab..3ddd6caba5 100644 --- a/cmake/docker/centos/dotnet.Dockerfile +++ b/cmake/docker/almalinux/dotnet.Dockerfile @@ -1,9 +1,10 @@ -FROM ortools/cmake:centos_swig AS env -# see: https://docs.microsoft.com/en-us/dotnet/core/install/linux-package-manager-centos8 -RUN dnf -y update \ -&& dnf -y install dotnet-sdk-6.0 \ -&& dnf clean all \ -&& rm -rf /var/cache/dnf +FROM ortools/cmake:almalinux_swig AS env +# Install .NET SDK +# see: https://learn.microsoft.com/en-us/dotnet/core/install/linux-scripted-manual#scripted-install +RUN wget -q "https://dot.net/v1/dotnet-install.sh" \ +&& chmod a+x dotnet-install.sh \ +&& ./dotnet-install.sh -c 3.1 -i /usr/local/bin \ +&& ./dotnet-install.sh -c 6.0 -i /usr/local/bin # Trigger first run experience by running arbitrary cmd RUN dotnet --info diff --git a/cmake/docker/centos/java.Dockerfile b/cmake/docker/almalinux/java.Dockerfile similarity index 94% rename from cmake/docker/centos/java.Dockerfile rename to cmake/docker/almalinux/java.Dockerfile index c480333b01..41d38ec708 100644 --- a/cmake/docker/centos/java.Dockerfile +++ b/cmake/docker/almalinux/java.Dockerfile @@ -1,4 +1,4 @@ -FROM ortools/cmake:centos_swig AS env +FROM ortools/cmake:almalinux_swig AS env RUN dnf -y update \ && dnf -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel maven \ && dnf clean all \ diff --git a/cmake/docker/centos/python.Dockerfile b/cmake/docker/almalinux/python.Dockerfile similarity index 81% rename from cmake/docker/centos/python.Dockerfile rename to cmake/docker/almalinux/python.Dockerfile index 32ad5979a5..5105f27c7b 100644 --- a/cmake/docker/centos/python.Dockerfile +++ b/cmake/docker/almalinux/python.Dockerfile @@ -1,10 +1,11 @@ -FROM ortools/cmake:centos_swig AS env +FROM ortools/cmake:almalinux_swig AS env ENV PATH=/root/.local/bin:$PATH RUN dnf -y update \ -&& dnf -y install python3.11-devel python3.11-numpy python3.11-pip \ +&& dnf -y install python3-devel python3-pip python3-numpy \ && dnf clean all \ && rm -rf /var/cache/dnf -RUN python3.11 -m pip install absl-py mypy mypy-protobuf pandas +RUN python3 -m pip install \ + absl-py mypy mypy-protobuf pandas FROM env AS devel WORKDIR /home/project diff --git a/cmake/docker/centos/Dockerfile b/cmake/docker/centos/Dockerfile deleted file mode 100644 index b426c687c5..0000000000 --- a/cmake/docker/centos/Dockerfile +++ /dev/null @@ -1,43 +0,0 @@ -# Create a virtual environment with all tools installed -# ref: https://quay.io/repository/centos/centos -FROM quay.io/centos/centos:stream AS base -# Install system build dependencies -ENV PATH=/usr/local/bin:$PATH -RUN dnf -y update \ -&& dnf -y install git wget openssl-devel \ -&& dnf -y groupinstall "Development Tools" \ -&& dnf clean all \ -&& rm -rf /var/cache/dnf - -# Install system build dependencies -ENV PATH=/usr/local/bin:$PATH -RUN dnf -y update \ -&& dnf -y install gcc-toolset-11 \ -&& dnf clean all \ -&& rm -rf /var/cache/dnf - -RUN echo "source /opt/rh/gcc-toolset-11/enable" >> /etc/bashrc -SHELL ["/bin/bash", "--login", "-c"] - -# Install CMake 3.28.3 -RUN wget -q "https://cmake.org/files/v3.28/cmake-3.28.3-linux-x86_64.sh" \ -&& chmod a+x cmake-3.28.3-linux-x86_64.sh \ -&& ./cmake-3.28.3-linux-x86_64.sh --prefix=/usr/local/ --skip-license \ -&& rm cmake-3.28.3-linux-x86_64.sh -CMD [ "/usr/bin/bash" ] - -# Install SWIG 4.2.0 -FROM base AS swig -RUN dnf -y update \ -&& dnf -y install pcre2-devel \ -&& dnf clean all \ -&& rm -rf /var/cache/dnf \ -&& wget -q "https://downloads.sourceforge.net/project/swig/swig/swig-4.2.0/swig-4.2.0.tar.gz" \ -&& tar xvf swig-4.2.0.tar.gz \ -&& rm swig-4.2.0.tar.gz \ -&& cd swig-4.2.0 \ -&& ./configure --prefix=/usr \ -&& make -j 4 \ -&& make install \ -&& cd .. \ -&& rm -rf swig-4.2.0 diff --git a/cmake/docker/rockylinux/Dockerfile b/cmake/docker/rockylinux/Dockerfile new file mode 100644 index 0000000000..c80770fc52 --- /dev/null +++ b/cmake/docker/rockylinux/Dockerfile @@ -0,0 +1,27 @@ +# Create a virtual environment with all tools installed +# ref: https://hub.docker.com/_/rockylinux +FROM rockylinux:9 AS base +# Install system build dependencies +ENV PATH=/usr/local/bin:$PATH +RUN dnf -y update \ +&& dnf -y install git wget openssl-devel cmake \ +&& dnf -y groupinstall "Development Tools" \ +&& dnf clean all \ +&& rm -rf /var/cache/dnf +CMD [ "/usr/bin/bash" ] + +# Install SWIG 4.2.1 +FROM base AS swig +RUN dnf -y update \ +&& dnf -y install pcre2-devel \ +&& dnf clean all \ +&& rm -rf /var/cache/dnf \ +&& wget -q "https://downloads.sourceforge.net/project/swig/swig/swig-4.2.1/swig-4.2.1.tar.gz" \ +&& tar xvf swig-4.2.1.tar.gz \ +&& rm swig-4.2.1.tar.gz \ +&& cd swig-4.2.1 \ +&& ./configure --prefix=/usr \ +&& make -j 4 \ +&& make install \ +&& cd .. \ +&& rm -rf swig-4.2.1 diff --git a/cmake/docker/rockylinux/cpp.Dockerfile b/cmake/docker/rockylinux/cpp.Dockerfile new file mode 100644 index 0000000000..b17e3c0da4 --- /dev/null +++ b/cmake/docker/rockylinux/cpp.Dockerfile @@ -0,0 +1,29 @@ +FROM ortools/cmake:rockylinux_base AS env +RUN cmake -version + +FROM env AS devel +WORKDIR /home/project +COPY . . + +FROM devel AS build +RUN cmake -S. -Bbuild -DBUILD_DEPS=ON +RUN cmake --build build --target all -v +RUN cmake --build build --target install + +FROM build AS test +RUN CTEST_OUTPUT_ON_FAILURE=1 cmake --build build --target test + +FROM env AS install_env +COPY --from=build /usr/local /usr/local/ + +FROM install_env AS install_devel +WORKDIR /home/sample +COPY cmake/samples/cpp . + +FROM install_devel AS install_build +RUN cmake -S. -Bbuild +RUN cmake --build build --target all -v +RUN cmake --build build --target install + +FROM install_build AS install_test +RUN cmake --build build --target test diff --git a/cmake/docker/rockylinux/dotnet.Dockerfile b/cmake/docker/rockylinux/dotnet.Dockerfile new file mode 100644 index 0000000000..63a2fa465e --- /dev/null +++ b/cmake/docker/rockylinux/dotnet.Dockerfile @@ -0,0 +1,36 @@ +FROM ortools/cmake:rockylinux_swig AS env +# Install .NET SDK +# see: https://learn.microsoft.com/en-us/dotnet/core/install/linux-scripted-manual#scripted-install +RUN wget -q "https://dot.net/v1/dotnet-install.sh" \ +&& chmod a+x dotnet-install.sh \ +&& ./dotnet-install.sh -c 3.1 -i /usr/local/bin \ +&& ./dotnet-install.sh -c 6.0 -i /usr/local/bin +# Trigger first run experience by running arbitrary cmd +RUN dotnet --info + +# Add the library src to our build env +FROM env AS devel +WORKDIR /home/project +COPY . . + +FROM devel AS build +RUN cmake -version +RUN cmake -S. -Bbuild -DBUILD_DOTNET=ON -DBUILD_CXX_SAMPLES=OFF -DBUILD_CXX_EXAMPLES=OFF +RUN cmake --build build --target all -v +RUN cmake --build build --target install -v + +FROM build AS test +RUN CTEST_OUTPUT_ON_FAILURE=1 cmake --build build --target test -v + +FROM env AS install_env +WORKDIR /home/sample +COPY --from=build /home/project/build/dotnet/packages/*.nupkg ./ + +FROM install_env AS install_devel +COPY cmake/samples/dotnet . + +FROM install_devel AS install_build +RUN dotnet build + +FROM install_build AS install_test +RUN dotnet test diff --git a/cmake/docker/rockylinux/java.Dockerfile b/cmake/docker/rockylinux/java.Dockerfile new file mode 100644 index 0000000000..602bf2c42e --- /dev/null +++ b/cmake/docker/rockylinux/java.Dockerfile @@ -0,0 +1,31 @@ +FROM ortools/cmake:rockylinux_swig AS env +RUN dnf -y update \ +&& dnf -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel maven \ +&& dnf clean all \ +&& rm -rf /var/cache/dnf + +FROM env AS devel +WORKDIR /home/project +COPY . . + +FROM devel AS build +RUN cmake -S. -Bbuild -DBUILD_JAVA=ON -DSKIP_GPG=ON \ + -DBUILD_CXX_SAMPLES=OFF -DBUILD_CXX_EXAMPLES=OFF +RUN cmake --build build --target all -v +RUN cmake --build build --target install + +FROM build AS test +RUN CTEST_OUTPUT_ON_FAILURE=1 cmake --build build --target test + +FROM env AS install_env +COPY --from=build /usr/local /usr/local/ + +FROM install_env AS install_devel +WORKDIR /home/sample +COPY cmake/samples/java . + +FROM install_devel AS install_build +RUN mvn compile + +FROM install_build AS install_test +RUN mvn test diff --git a/cmake/docker/rockylinux/python.Dockerfile b/cmake/docker/rockylinux/python.Dockerfile new file mode 100644 index 0000000000..269b43e664 --- /dev/null +++ b/cmake/docker/rockylinux/python.Dockerfile @@ -0,0 +1,34 @@ +FROM ortools/cmake:rockylinux_swig AS env +ENV PATH=/root/.local/bin:$PATH +RUN dnf -y update \ +&& dnf -y install python3-devel python3-pip python3-numpy \ +&& dnf clean all \ +&& rm -rf /var/cache/dnf +RUN python3 -m pip install \ + absl-py mypy mypy-protobuf pandas + +FROM env AS devel +WORKDIR /home/project +COPY . . + +FROM devel AS build +RUN cmake -S. -Bbuild -DBUILD_PYTHON=ON -DBUILD_CXX_SAMPLES=OFF -DBUILD_CXX_EXAMPLES=OFF +RUN cmake --build build --target all -v +RUN cmake --build build --target install + +FROM build AS test +RUN CTEST_OUTPUT_ON_FAILURE=1 cmake --build build --target test + +FROM env AS install_env +WORKDIR /home/sample +COPY --from=build /home/project/build/python/dist/*.whl . +RUN python3 -m pip install *.whl + +FROM install_env AS install_devel +COPY cmake/samples/python . + +FROM install_devel AS install_build +RUN python3 -m compileall . + +FROM install_build AS install_test +RUN python3 sample.py diff --git a/cmake/docker/toolchain/Dockerfile b/cmake/docker/toolchain/Dockerfile index abc8a45133..7e738befd9 100644 --- a/cmake/docker/toolchain/Dockerfile +++ b/cmake/docker/toolchain/Dockerfile @@ -5,7 +5,7 @@ FROM ubuntu:latest AS env ENV PATH=/usr/local/bin:$PATH RUN apt-get update -qq \ && DEBIAN_FRONTEND=noninteractive apt-get install -yq git wget libssl-dev build-essential \ - ninja-build python3 pkgconf libglib2.0-dev \ + ninja-build python3 python3-venv pkgconf libglib2.0-dev \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* ENTRYPOINT ["/usr/bin/bash", "-c"] @@ -23,9 +23,12 @@ COPY . . ENV PROJECT=or-tools ARG TARGET -ENV TARGET ${TARGET:-unknown} +ENV TARGET=${TARGET:-unknown} -FROM devel AS build +FROM devel AS toolchain +RUN ./tools/cross_compile.sh toolchain + +FROM toolchain AS build RUN cmake --version RUN ./tools/cross_compile.sh build diff --git a/cmake/docker/ubuntu/Dockerfile b/cmake/docker/ubuntu/Dockerfile index 2b1f041393..4eac7c6b09 100644 --- a/cmake/docker/ubuntu/Dockerfile +++ b/cmake/docker/ubuntu/Dockerfile @@ -5,17 +5,10 @@ FROM ubuntu:rolling AS base ENV PATH=/usr/local/bin:$PATH RUN apt-get update -qq \ && DEBIAN_FRONTEND=noninteractive apt-get install -yq \ - git wget libssl-dev build-essential \ + git wget libssl-dev build-essential cmake \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* -# Install CMake 3.28.3 -RUN wget -q "https://cmake.org/files/v3.28/cmake-3.28.3-linux-x86_64.sh" \ -&& chmod a+x cmake-3.28.3-linux-x86_64.sh \ -&& ./cmake-3.28.3-linux-x86_64.sh --prefix=/usr/local/ --skip-license \ -&& rm cmake-3.28.3-linux-x86_64.sh -CMD [ "/usr/bin/bash" ] - FROM base AS swig RUN apt-get update -qq \ && apt-get install -yq swig \