Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
177 changes: 177 additions & 0 deletions .github/workflows/cross-compile.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
name: Cross compile

on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch: {}

env:
UBUNTU_SNAPSHOT: 20260825T200000Z

jobs:
build:
name: ${{ matrix.host_arch }} to ${{ matrix.target_arch }}
strategy:
fail-fast: false
matrix:
include:
- host_arch: amd64
target_arch: arm64
runner: ubuntu-24.04
compiler_package: gcc-aarch64-linux-gnu=4:13.2.0-7ubuntu1
cxx_compiler_package: g++-aarch64-linux-gnu=4:13.2.0-7ubuntu1
toolchain: CMake/toolchains/linux-aarch64-gnu.cmake
arch_flags: -march=armv8.2-a -mtune=generic
file_pattern: ARM aarch64
- host_arch: arm64
target_arch: amd64
runner: ubuntu-24.04-arm
compiler_package: gcc-x86-64-linux-gnu=4:13.2.0-7ubuntu1
cxx_compiler_package: g++-x86-64-linux-gnu=4:13.2.0-7ubuntu1
toolchain: CMake/toolchains/linux-x86_64-gnu.cmake
arch_flags: -march=x86-64-v3 -mtune=generic
file_pattern: x86-64
runs-on: ${{ matrix.runner }}
permissions:
contents: read

steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
submodules: recursive

- name: Configure pinned Ubuntu package snapshot
env:
TARGET_ARCH: ${{ matrix.target_arch }}
run: |
sudo dpkg --add-architecture "$TARGET_ARCH"
sudo rm -f /etc/apt/sources.list
sudo rm -f /etc/apt/sources.list.d/*
cat <<EOF | sudo tee /etc/apt/sources.list.d/ubuntu.sources
Types: deb
URIs: https://snapshot.ubuntu.com/ubuntu/${UBUNTU_SNAPSHOT}
Suites: noble noble-updates noble-backports noble-security
Components: main restricted universe multiverse
Architectures: amd64 arm64
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF
sudo apt-get update

- name: Read pinned host and target packages
id: packages
env:
TARGET_ARCH: ${{ matrix.target_arch }}
COMPILER_PACKAGE: ${{ matrix.compiler_package }}
CXX_COMPILER_PACKAGE: ${{ matrix.cxx_compiler_package }}
run: |
host_packages=$(xargs < .github/workflows/cross-host-packages.lock)
target_packages=$(awk -F= -v arch="$TARGET_ARCH" '{printf "%s:%s=%s ", $1, arch, substr($0, index($0, "=") + 1)}' .github/workflows/cross-target-packages.lock)
echo "packages=$host_packages $COMPILER_PACKAGE $CXX_COMPILER_PACKAGE $target_packages" >> "$GITHUB_OUTPUT"

- name: Prepare apt archive cache
run: |
sudo rm -f /etc/apt/apt.conf.d/docker-clean
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' | sudo tee /etc/apt/apt.conf.d/keep-cache
sudo chmod 0777 /var/cache/apt/archives

- name: Cache apt archives
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: /var/cache/apt/archives
key: apt-noble-${{ env.UBUNTU_SNAPSHOT }}-${{ matrix.host_arch }}-${{ matrix.target_arch }}-${{ hashFiles('.github/workflows/cross-*-packages.lock') }}

- name: Install pinned cross-build packages
env:
PACKAGES: ${{ steps.packages.outputs.packages }}
run: |
# Word splitting is intentional: PACKAGES contains apt package arguments.
# shellcheck disable=SC2086
sudo apt-get install -y --allow-downgrades --no-install-recommends $PACKAGES

- name: Configure
env:
ARCH_FLAGS: ${{ matrix.arch_flags }}
run: |
cmake -S . -B build -G "Unix Makefiles" \
-DCMAKE_TOOLCHAIN_FILE="${{ matrix.toolchain }}" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_FLAGS="$ARCH_FLAGS" \
-DCMAKE_CXX_FLAGS="$ARCH_FLAGS" \
-DBUILD_TESTING=OFF \
-DENABLE_DSA=OFF \
-DENABLE_ISAL=OFF

- name: Build at maximum parallelism
run: cmake --build build --parallel "$(nproc)"

- name: Verify target architecture
env:
FILE_PATTERN: ${{ matrix.file_pattern }}
run: |
file build/output/overlaybd-tcmu
file build/output/overlaybd-tcmu | grep -F "$FILE_PATTERN"

optional-dependencies:
name: Optional dependency (${{ matrix.feature }})
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
include:
- feature: bundled-curl
cmake_flags: -DBUILD_CURL_FROM_SOURCE=ON
target: overlaybd-tcmu
- feature: dsa
cmake_flags: -DENABLE_DSA=ON
target: zfile_lib
- feature: isa-l
cmake_flags: -DENABLE_ISAL=ON
target: zfile_lib
permissions:
contents: read
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
submodules: recursive

- name: Configure pinned Ubuntu snapshot and apt cache
run: |
sudo rm -f /etc/apt/sources.list
sudo rm -f /etc/apt/sources.list.d/*
cat <<EOF | sudo tee /etc/apt/sources.list.d/ubuntu.sources
Types: deb
URIs: https://snapshot.ubuntu.com/ubuntu/${UBUNTU_SNAPSHOT}
Suites: noble noble-updates noble-backports noble-security
Components: main restricted universe multiverse
Architectures: amd64
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF
sudo apt-get update
sudo rm -f /etc/apt/apt.conf.d/docker-clean
echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' | sudo tee /etc/apt/apt.conf.d/keep-cache
sudo chmod 0777 /var/cache/apt/archives

- name: Cache apt archives
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: /var/cache/apt/archives
key: apt-noble-${{ env.UBUNTU_SNAPSHOT }}-amd64-optional-${{ hashFiles('.github/workflows/optional-build-packages.lock') }}

- name: Install pinned build packages
run: xargs sudo apt-get install -y --allow-downgrades --no-install-recommends < .github/workflows/optional-build-packages.lock

- name: Configure optional dependency
env:
CMAKE_FLAGS: ${{ matrix.cmake_flags }}
run: |
# Word splitting is intentional: CMAKE_FLAGS contains CMake arguments.
# shellcheck disable=SC2086
cmake -S . -B build -G "Unix Makefiles" \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_TESTING=OFF \
$CMAKE_FLAGS

- name: Build optional dependency at maximum parallelism
run: cmake --build build --target "${{ matrix.target }}" --parallel "$(nproc)"
13 changes: 13 additions & 0 deletions .github/workflows/cross-host-packages.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
autoconf=2.71-3
automake=1:1.16.5-1.3ubuntu1
ca-certificates=20260601~24.04.1
cmake=3.28.3-1build7
file=1:5.45-3build1
gcc=4:13.2.0-7ubuntu1
git=1:2.43.0-1ubuntu7.3
git-man=1:2.43.0-1ubuntu7.3
libtool=2.4.7-7build1
make=4.3-4.1build2
ninja-build=1.11.1-2
pkg-config=1.8.1-2build1
protobuf-compiler=3.21.12-8.2ubuntu0.3
15 changes: 15 additions & 0 deletions .github/workflows/cross-target-packages.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
libaio-dev=0.3.113-6build1.1
libcurl4-openssl-dev=8.5.0-2ubuntu10.13
libext2fs-dev=1.47.0-2.4~exp1ubuntu4.1
libgflags-dev=2.2.2-2build1
libjson-c-dev=0.17-1build1
libkmod-dev=31+20240202-2ubuntu7.2
libnl-3-dev=3.7.0-0.3build1.1
libnl-genl-3-dev=3.7.0-0.3build1.1
libpci-dev=1:3.10.0-2build1
libprotobuf-dev=3.21.12-8.2ubuntu0.3
libssl-dev=3.0.13-0ubuntu3.15
libsystemd-dev=255.4-1ubuntu8.17
libzstd-dev=1.5.5+dfsg2-2build1.1
uuid-dev=2.39.3-9ubuntu6.5
zlib1g-dev=1:1.3.dfsg-3.1ubuntu2.1
28 changes: 28 additions & 0 deletions .github/workflows/optional-build-packages.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
autoconf=2.71-3
automake=1:1.16.5-1.3ubuntu1
ca-certificates=20260601~24.04.1
cmake=3.28.3-1build7
file=1:5.45-3build1
g++=4:13.2.0-7ubuntu1
git=1:2.43.0-1ubuntu7.3
git-man=1:2.43.0-1ubuntu7.3
libaio-dev=0.3.113-6build1.1
libcurl4-openssl-dev=8.5.0-2ubuntu10.13
libext2fs-dev=1.47.0-2.4~exp1ubuntu4.1
libgflags-dev=2.2.2-2build1
libjson-c-dev=0.17-1build1
libkmod-dev=31+20240202-2ubuntu7.2
libnl-3-dev=3.7.0-0.3build1.1
libnl-genl-3-dev=3.7.0-0.3build1.1
libpci-dev=1:3.10.0-2build1
libprotobuf-dev=3.21.12-8.2ubuntu0.3
libssl-dev=3.0.13-0ubuntu3.15
libsystemd-dev=255.4-1ubuntu8.17
libtool=2.4.7-7build1
libzstd-dev=1.5.5+dfsg2-2build1.1
make=4.3-4.1build2
nasm=2.16.01-1build1
pkg-config=1.8.1-2build1
protobuf-compiler=3.21.12-8.2ubuntu0.3
uuid-dev=2.39.3-9ubuntu6.5
zlib1g-dev=1:1.3.dfsg-3.1ubuntu2.1
9 changes: 8 additions & 1 deletion CMake/Findaio.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,11 @@ find_library(AIO_LIBRARIES aio)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(aio DEFAULT_MSG AIO_LIBRARIES AIO_INCLUDE_DIR)

mark_as_advanced(AIO_INCLUDE_DIR AIO_LIBRARIES)
if(aio_FOUND AND NOT TARGET AIO::aio)
add_library(AIO::aio UNKNOWN IMPORTED)
set_target_properties(AIO::aio PROPERTIES
IMPORTED_LOCATION "${AIO_LIBRARIES}"
INTERFACE_INCLUDE_DIRECTORIES "${AIO_INCLUDE_DIR}")
endif()

mark_as_advanced(AIO_INCLUDE_DIR AIO_LIBRARIES)
89 changes: 68 additions & 21 deletions CMake/Findcurl.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -17,35 +17,82 @@ if(${BUILD_CURL_FROM_SOURCE})
if (NOT curl_bundle_POPULATED)
FetchContent_Populate(curl_bundle)
endif()
set(CURL_BUILD_SOURCE_DIR "${curl_bundle_BINARY_DIR}/source")
find_package(openssl)
set(_curl_build_signature "${curl_bundle_BINARY_DIR}/overlaybd-build-config")
file(GENERATE OUTPUT "${_curl_build_signature}" CONTENT
"CC=${CMAKE_C_COMPILER}\nCXX=${CMAKE_CXX_COMPILER}\nAR=${CMAKE_AR}\nRANLIB=${CMAKE_RANLIB}\nCFLAGS=${CMAKE_C_FLAGS}\nCXXFLAGS=${CMAKE_CXX_FLAGS}\nTRIPLET=${OVERLAYBD_TARGET_TRIPLET}\nOPENSSL=${OPENSSL_SSL_LIBRARY}\n")
set(_curl_configure_args
--with-ssl=${OPENSSL_ROOT_DIR}
--without-libssh2 --enable-static --enable-shared=no --enable-optimize
--disable-manual --without-libidn
--disable-ftp --disable-file --disable-ldap --disable-ldaps
--disable-rtsp --disable-dict --disable-telnet --disable-tftp
--disable-pop3 --disable-imap --disable-smb --disable-smtp
--disable-gopher --without-nghttp2 --enable-http
--with-pic=PIC
--prefix=${curl_bundle_BINARY_DIR})
if(CMAKE_CROSSCOMPILING)
if(OVERLAYBD_TARGET_TRIPLET)
list(APPEND _curl_configure_args --host=${OVERLAYBD_TARGET_TRIPLET})
elseif(CMAKE_C_COMPILER_TARGET)
list(APPEND _curl_configure_args --host=${CMAKE_C_COMPILER_TARGET})
elseif(OVERLAYBD_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm64)$")
list(APPEND _curl_configure_args --host=aarch64-linux-gnu)
else()
list(APPEND _curl_configure_args --host=x86_64-linux-gnu)
endif()
endif()
add_custom_command(
OUTPUT ${curl_bundle_BINARY_DIR}/lib/libcurl.a
WORKING_DIRECTORY ${curl_bundle_SOURCE_DIR}
COMMAND
export CC=${CMAKE_C_COMPILER} &&
export CXX=${CMAKE_CXX_COMPILER} &&
export LD=${CMAKE_LINKER} &&
export CFLAGS=-fPIC &&
export LIBS=-ldl &&
autoreconf -i && sh configure --with-ssl="${OPENSSL_ROOT_DIR}"
--without-libssh2 --enable-static --enable-shared=no --enable-optimize
--disable-manual --without-libidn
--disable-ftp --disable-file --disable-ldap --disable-ldaps
--disable-rtsp --disable-dict --disable-telnet --disable-tftp
--disable-pop3 --disable-imap --disable-smb --disable-smtp
--disable-gopher --without-nghttp2 --enable-http
--with-pic=PIC
--prefix="${curl_bundle_BINARY_DIR}" && make -j 8 && make install)
add_custom_target(libcurl_static_build
DEPENDS ${curl_bundle_BINARY_DIR}/lib/libcurl.a)
add_dependencies(libcurl_static_build openssl102_static_build)
OUTPUT
${curl_bundle_BINARY_DIR}/lib/libcurl.a
${curl_bundle_BINARY_DIR}/include/curl/curl.h
COMMAND ${CMAKE_COMMAND} -E remove_directory ${CURL_BUILD_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory
${curl_bundle_SOURCE_DIR} ${CURL_BUILD_SOURCE_DIR}
COMMAND ${CMAKE_COMMAND} -E chdir ${CURL_BUILD_SOURCE_DIR}
${CMAKE_COMMAND} -E env
"CC=${CMAKE_C_COMPILER}"
"CXX=${CMAKE_CXX_COMPILER}"
"LD=${CMAKE_LINKER}"
"AR=${CMAKE_AR}"
"RANLIB=${CMAKE_RANLIB}"
"CFLAGS=${CMAKE_C_FLAGS} -fPIC"
"CXXFLAGS=${CMAKE_CXX_FLAGS} -fPIC"
"LIBS=-ldl"
autoreconf -i
COMMAND ${CMAKE_COMMAND} -E chdir ${CURL_BUILD_SOURCE_DIR}
${CMAKE_COMMAND} -E env
"CC=${CMAKE_C_COMPILER}"
"CXX=${CMAKE_CXX_COMPILER}"
"LD=${CMAKE_LINKER}"
"AR=${CMAKE_AR}"
"RANLIB=${CMAKE_RANLIB}"
"CFLAGS=${CMAKE_C_FLAGS} -fPIC"
"CXXFLAGS=${CMAKE_CXX_FLAGS} -fPIC"
"LIBS=-ldl"
sh configure ${_curl_configure_args}
COMMAND ${CMAKE_COMMAND} -E chdir ${CURL_BUILD_SOURCE_DIR}
${OVERLAYBD_MAKE_EXECUTABLE} -j${OVERLAYBD_SUBBUILD_JOBS}
COMMAND ${CMAKE_COMMAND} -E chdir ${CURL_BUILD_SOURCE_DIR}
${OVERLAYBD_MAKE_EXECUTABLE} install
DEPENDS
${curl_bundle_SOURCE_DIR}/configure.ac
"${_curl_build_signature}"
"${OPENSSL_SSL_LIBRARY}"
"${CMAKE_CURRENT_LIST_FILE}"
VERBATIM)
add_custom_target(libcurl_static_build DEPENDS
${curl_bundle_BINARY_DIR}/lib/libcurl.a
${curl_bundle_BINARY_DIR}/include/curl/curl.h)
add_dependencies(libcurl_static_build OpenSSL::SSL OpenSSL::Crypto)
make_directory(${curl_bundle_BINARY_DIR}/include)
endif()

set(CURL_FOUND yes)
set(CURL_LIBRARY ${curl_bundle_BINARY_DIR}/lib/libcurl.a)
set(CURL_THIRDPARTY_DEPS OpenSSL::SSL OpenSSL::Crypto z)
set(CURL_LIBRARIES ${CURL_LIBRARY} ${CURL_THIRDPARTY_DEPS})
set(CURL_LIBRARIES CURL::libcurl)
set(CURL_INCLUDE_DIR ${curl_bundle_BINARY_DIR}/include)
set(CURL_INCLUDE_DIRS ${CURL_INCLUDE_DIR})
set(CURL_VERSION_STRING 7.42.1)
Expand Down
Loading
Loading