diff --git a/.github/docker/alpine-3.21.Dockerfile b/.github/docker/alpine-3.21.Dockerfile new file mode 100644 index 0000000000..fef9810703 --- /dev/null +++ b/.github/docker/alpine-3.21.Dockerfile @@ -0,0 +1,46 @@ +# Copyright (C) 2025 Intel Corporation +# Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# +# Dockerfile - a 'recipe' for Docker to build an image of Alpine +# environment for building the Unified Memory Framework project. +# + +# Pull base Alpine image version 3.21 +FROM registry.hub.docker.com/library/alpine@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c + +# Set environment variables +ENV OS=alpine +ENV OS_VER=3.21 + +# Base development packages +ARG BASE_DEPS="\ + bash \ + cmake \ + git \ + g++ \ + make \ + sudo" + +# UMF's dependencies +ARG UMF_DEPS="\ + hwloc-dev" + +# Dependencies for tests +ARG TEST_DEPS="\ + numactl-dev" + +# Update and install required packages +RUN apk update \ + && apk add --no-cache \ + ${BASE_DEPS} \ + ${TEST_DEPS} \ + ${UMF_DEPS} + +# Add a new (non-root) 'test_user' +ENV USER=test_user +RUN adduser -D -G wheel ${USER} +RUN echo '%wheel ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers + +USER test_user diff --git a/.github/scripts/alpine_build.sh b/.github/scripts/alpine_build.sh new file mode 100755 index 0000000000..4bfdb44616 --- /dev/null +++ b/.github/scripts/alpine_build.sh @@ -0,0 +1,17 @@ +#!/bin/bash +# Copyright (C) 2025 Intel Corporation +# Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# alpine_build.sh - Script for building UMF on Alpine image + +set -e + +UMF_BUILD_TYPE=$1 +WORKDIR=$2 + +sudo chown $USER $WORKDIR +cd unified-memory-framework + +cmake -B build -DCMAKE_BUILD_TYPE=$UMF_BUILD_TYPE -DUMF_BUILD_TESTS=ON -DUMF_BUILD_EXAMPLES=ON +cmake --build build diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index aaaae6ddce..3fd68c18fd 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -513,3 +513,28 @@ jobs: SYCL: uses: ./.github/workflows/reusable_sycl.yml + + alpine: + name: Alpine + env: + HOST_WORKDIR: ${{github.workspace}} + WORKDIR: /unified-memory-framework + strategy: + matrix: + build_type: [Debug, Release] + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + + - name: Build Alpine image + run: | + docker build . -f .github/docker/alpine-3.21.Dockerfile -t umf-alpine-3.21 + + - name: Run UMF build on Alpine image + run: | + docker run --rm -i -v $HOST_WORKDIR:$WORKDIR \ + umf-alpine-3.21 $WORKDIR/.github/scripts/alpine_build.sh ${{matrix.build_type}} $WORKDIR diff --git a/src/utils/utils_log.c b/src/utils/utils_log.c index 29f22de868..3c57ce033f 100644 --- a/src/utils/utils_log.c +++ b/src/utils/utils_log.c @@ -10,7 +10,6 @@ #ifdef _WIN32 #include #else -#define _GNU_SOURCE 1 #include #include #include @@ -141,28 +140,29 @@ static void utils_log_internal(utils_log_level_t level, int perror, *err = '\0'; postfix = "[strerror_s failed]"; } -#elif defined(__APPLE__) - char err[1024]; // max size according to manpage. +#else int saveno = errno; errno = 0; - if (strerror_r(saveno, err, sizeof(err))) { - /* should never happen */ + +#if defined(__APPLE__) || \ + ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !_GNU_SOURCE) + char err[1024]; + int ret = strerror_r(saveno, err, sizeof(err)); + if (ret) { *err = '\0'; postfix = "[strerror_r failed]"; } - if (errno == ERANGE) { postfix = "[truncated...]"; } - errno = saveno; #else - char err_buff[1024]; // max size according to manpage. - int saveno = errno; - errno = 0; + char err_buff[1024]; const char *err = strerror_r(saveno, err_buff, sizeof(err_buff)); if (errno == ERANGE) { postfix = "[truncated...]"; } +#endif + errno = saveno; #endif strncpy(b_pos, err, b_size);