diff --git a/.github/workflows/01-ci-pipeline.yml b/.github/workflows/01-ci-pipeline.yml index c2296f501..173e04248 100644 --- a/.github/workflows/01-ci-pipeline.yml +++ b/.github/workflows/01-ci-pipeline.yml @@ -84,6 +84,14 @@ jobs: os: ubuntu-24.04 compiler: clang + build-and-test-linux-riscv64: + name: Build & Test (linux-riscv64) + needs: lint + uses: ./.github/workflows/03-macos-linux-build.yml + with: + platform: linux-riscv64 + os: ubuntu-24.04-riscv + build-android: name: Build & Test (android) needs: lint diff --git a/.github/workflows/03-macos-linux-build.yml b/.github/workflows/03-macos-linux-build.yml index 1dd1e45c7..c07887543 100644 --- a/.github/workflows/03-macos-linux-build.yml +++ b/.github/workflows/03-macos-linux-build.yml @@ -21,7 +21,6 @@ permissions: contents: read jobs: - # Build and test matrix (parallel execution) build-and-test: name: Build & Test (${{ inputs.platform }}) runs-on: ${{ inputs.os }} @@ -32,7 +31,7 @@ jobs: include: - os: ${{ inputs.os }} platform: ${{ inputs.platform }} - arch_flag: "" # Use appropriate architecture + arch_flag: "" steps: - name: Checkout code @@ -41,12 +40,27 @@ jobs: submodules: recursive - name: Set up Python + if: ${{ !contains(inputs.os, 'riscv') }} uses: actions/setup-python@v6 with: python-version: '3.10' cache: 'pip' cache-dependency-path: 'pyproject.toml' + - name: Select Python on RISC-V + if: ${{ contains(inputs.os, 'riscv') }} + run: | + python3.10 --version + echo "PYTHON=python3.10" >> $GITHUB_ENV + shell: bash + + - name: Select Python on non-RISC-V + if: ${{ !contains(inputs.os, 'riscv') }} + run: | + python --version + echo "PYTHON=python" >> $GITHUB_ENV + shell: bash + - name: Install Clang if: inputs.compiler == 'clang' && runner.os == 'Linux' run: | @@ -61,7 +75,6 @@ jobs: - name: Set up environment variables run: | - # Set number of processors for parallel builds if [[ "${{ matrix.platform }}" == "macos-arm64" ]]; then NPROC=$(sysctl -n hw.ncpu 2>/dev/null || echo 2) else @@ -70,25 +83,41 @@ jobs: echo "NPROC=$NPROC" >> $GITHUB_ENV echo "Using $NPROC parallel jobs for builds" - # Set compiler when clang is requested if [[ "${{ inputs.compiler }}" == "clang" ]]; then echo "CC=clang" >> $GITHUB_ENV echo "CXX=clang++" >> $GITHUB_ENV fi - # Add Python user base bin to PATH for pip-installed CLI tools - echo "$(python -c 'import site; print(site.USER_BASE)')/bin" >> $GITHUB_PATH + echo "$($PYTHON -c 'import site; print(site.USER_BASE)')/bin" >> $GITHUB_PATH shell: bash + - name: Get pip cache dir + if: ${{ contains(inputs.os, 'riscv') }} + id: pip-cache + run: | + echo "dir=$($PYTHON -m pip cache dir)" >> $GITHUB_OUTPUT + shell: bash + + - name: Cache pip dependencies for RISC-V + if: ${{ contains(inputs.os, 'riscv') }} + uses: actions/cache@v4 + with: + path: ${{ steps.pip-cache.outputs.dir }} + key: ${{ runner.os }}-riscv-pip-${{ hashFiles('**/pyproject.toml') }} + restore-keys: | + ${{ runner.os }}-riscv-pip- + - name: Install dependencies run: | - python -m pip install --upgrade pip \ - pybind11==3.0 \ - cmake==3.30.0 \ - ninja==1.11.1 \ - pytest \ - scikit-build-core \ - setuptools_scm + $PYTHON -m pip install --upgrade pip + DEPS="pybind11==3.0 cmake==3.30.0 ninja==1.11.1 pytest scikit-build-core setuptools_scm" + + if [[ "${{ inputs.os }}" == *"riscv"* ]]; then + echo "RISC-V architecture detected. Adding build tools for compiling numpy from source..." + DEPS="$DEPS meson-python meson Cython" + fi + + $PYTHON -m pip install $DEPS shell: bash - name: Build from source @@ -97,7 +126,7 @@ jobs: CMAKE_GENERATOR="Unix Makefiles" \ CMAKE_BUILD_PARALLEL_LEVEL="$NPROC" \ - python -m pip install -v . \ + $PYTHON -m pip install -v . \ --no-build-isolation \ --config-settings='cmake.define.BUILD_TOOLS="ON"' \ ${{ matrix.arch_flag }} @@ -112,7 +141,7 @@ jobs: - name: Run Python Tests run: | cd "$GITHUB_WORKSPACE" - python -m pytest python/tests/ + $PYTHON -m pytest python/tests/ shell: bash - name: Run C++ Examples diff --git a/src/ailego/internal/cpu_features.cc b/src/ailego/internal/cpu_features.cc index 06e1444d5..d124aea58 100644 --- a/src/ailego/internal/cpu_features.cc +++ b/src/ailego/internal/cpu_features.cc @@ -17,7 +17,9 @@ #if defined(_MSC_VER) #include -#elif !defined(__ARM_ARCH) +#endif + +#if (defined(__x86_64__) || defined(__i386__)) && !defined(_MSC_VER) #include #endif @@ -34,7 +36,7 @@ namespace internal { CpuFeatures::CpuFlags CpuFeatures::flags_; -#if defined(_MSC_VER) +#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) CpuFeatures::CpuFlags::CpuFlags(void) : L1_ECX(0), L1_EDX(0), L7_EBX(0), L7_ECX(0), L7_EDX(0) { int l1[4] = {0, 0, 0, 0}; @@ -48,7 +50,7 @@ CpuFeatures::CpuFlags::CpuFlags(void) L7_ECX = l7[2]; L7_EDX = l7[3]; } -#elif !defined(__ARM_ARCH) +#elif defined(__x86_64__) || defined(__i386__) CpuFeatures::CpuFlags::CpuFlags(void) : L1_ECX(0), L1_EDX(0), L7_EBX(0), L7_ECX(0), L7_EDX(0) { uint32_t eax, ebx, ecx, edx;