diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index a3ab51ad..a1280454 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,21 +1,3 @@ -FROM mcr.microsoft.com/devcontainers/cpp:1-debian-12 - -# Install required packages (excluding mono and nuget-related setup) -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - python3-jinja2 pkg-config autoconf automake libtool python3 linux-libc-dev curl libltdl-dev libx11-dev libxft-dev libxext-dev libwayland-dev libxkbcommon-dev libegl1-mesa-dev libibus-1.0-dev libxrandr-dev libxrandr2 wayland-protocols extra-cmake-modules xorg-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev libgtk-3-dev libayatana-appindicator3-dev ca-certificates && \ - update-ca-certificates && \ - curl -sSL https://github.com/Kitware/CMake/releases/download/v3.25.0/cmake-3.25.0-linux-x86_64.sh -o /tmp/cmake-install.sh && \ - chmod +x /tmp/cmake-install.sh && \ - /tmp/cmake-install.sh --skip-license --prefix=/usr/local && \ - rm /tmp/cmake-install.sh - -# Download and extract cross-compile toolchain -ENV CROSS_COMPILE_ROOT=/opt/cross-compile -RUN mkdir -p ${CROSS_COMPILE_ROOT} && \ - curl -L -o ${CROSS_COMPILE_ROOT}/cross-compile.tar.xz "https://github.com/sshcrack/led-matrix/releases/download/v0.0.1-beta/cross-compile.tar.xz" && \ - tar -xvf ${CROSS_COMPILE_ROOT}/cross-compile.tar.xz -C ${CROSS_COMPILE_ROOT} && \ - rm ${CROSS_COMPILE_ROOT}/cross-compile.tar.xz - -# Set environment variable for cross-compile toolchain -ENV PATH="${CROSS_COMPILE_ROOT}:$PATH" +# Add custom NuGet source for vcpkg as vscode user +USER vscode +RUN mono `vcpkg fetch nuget | tail -n 1` sources add -Name sshcrack -Source https://nuget.sshcrack.me/v3/index.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index d648996c..e7adf262 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -19,7 +19,8 @@ "containerEnv": { "BUILD_TYPE": "RelWithDebInfo", - "CROSS_COMPILE_ROOT": "/opt/cross-compile" + "CROSS_COMPILE_ROOT": "/opt/cross-compile", + "VCPKG_BINARY_SOURCES": "clear;nuget,https://nuget.sshcrack.me/v3/index.json,read" }, "updateContentCommand": "git submodule update --init --recursive", "customizations": { diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2ab06a83..0bf72603 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -131,20 +131,6 @@ jobs: tar -xvf cross-compile.tar.xz rm cross-compile.tar.xz - - name: Create vcpkg triplet for arm64-rpi - if: matrix.requires-toolchain - run: | - mkdir -p $VCPKG_ROOT/triplets/community - cat > $VCPKG_ROOT/triplets/community/arm64-rpi.cmake << 'EOF' - set(VCPKG_TARGET_ARCHITECTURE arm64) - set(VCPKG_CRT_LINKAGE dynamic) - set(VCPKG_LIBRARY_LINKAGE static) - - set(VCPKG_CMAKE_SYSTEM_NAME Linux) - - set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE ${{ runner.temp }}/cross-compile/PI.cmake) - EOF - # React Native web build only for led-matrix build - name: Install pnpm if: matrix.name == 'led-matrix' diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index ac2fd3fd..8888a779 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -94,19 +94,6 @@ jobs: tar -xvf cross-compile.tar.xz rm cross-compile.tar.xz - - name: Create vcpkg triplet for arm64-rpi - run: | - mkdir -p $VCPKG_ROOT/triplets/community - cat > $VCPKG_ROOT/triplets/community/arm64-rpi.cmake << 'EOF' - set(VCPKG_TARGET_ARCHITECTURE arm64) - set(VCPKG_CRT_LINKAGE dynamic) - set(VCPKG_LIBRARY_LINKAGE static) - - set(VCPKG_CMAKE_SYSTEM_NAME Linux) - - set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE ${{ runner.temp }}/cross-compile/PI.cmake) - EOF - # React Native web build only for led-matrix build - name: Install pnpm uses: pnpm/action-setup@v4 diff --git a/.github/workflows/create-release.yml b/.github/workflows/create-release.yml index 996d408a..f8390914 100644 --- a/.github/workflows/create-release.yml +++ b/.github/workflows/create-release.yml @@ -201,20 +201,6 @@ jobs: tar -xvf cross-compile.tar.xz rm cross-compile.tar.xz - - name: Create vcpkg triplet for arm64-rpi - if: matrix.requires-toolchain - run: | - mkdir -p $VCPKG_ROOT/triplets/community - cat > $VCPKG_ROOT/triplets/community/arm64-rpi.cmake << 'EOF' - set(VCPKG_TARGET_ARCHITECTURE arm64) - set(VCPKG_CRT_LINKAGE dynamic) - set(VCPKG_LIBRARY_LINKAGE static) - - set(VCPKG_CMAKE_SYSTEM_NAME Linux) - - set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE ${{ runner.temp }}/cross-compile/PI.cmake) - EOF - - name: Build ${{ matrix.name }} uses: lukka/run-cmake@v10 with: diff --git a/CMakePresets.json b/CMakePresets.json index 52ee121b..ea851212 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -8,6 +8,7 @@ "cacheVariables": { "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", "VCPKG_CHAINLOAD_TOOLCHAIN_FILE": "${sourceDir}/cmake/PI.cmake", + "VCPKG_OVERLAY_TRIPLETS": "${sourceDir}/cmake/triplets", "VCPKG_TARGET_TRIPLET": "arm64-rpi", "CMAKE_BUILD_TYPE": "RelWithDebInfo" } diff --git a/cmake/PI.cmake b/cmake/PI.cmake index 93fccb35..78b26d75 100644 --- a/cmake/PI.cmake +++ b/cmake/PI.cmake @@ -1,17 +1,32 @@ # Raspberry Pi Cross-Compilation Toolchain File -# Check for CROSS_COMPILE_ROOT - first environment variable, then CMake variable -set(CROSS_COMPILE_ROOT_PATH "") +# Set the cross-compile directory name (this is a bit hacky but works I know) +set(LED_MATRIX_BUILD_DIR "${CMAKE_CURRENT_LIST_DIR}/../build") +set(CROSS_COMPILE_DIR "${LED_MATRIX_BUILD_DIR}/cross-compile") -if(DEFINED ENV{CROSS_COMPILE_ROOT}) - set(CROSS_COMPILE_ROOT_PATH "$ENV{CROSS_COMPILE_ROOT}") - message(STATUS "Using CROSS_COMPILE_ROOT from environment variable: ${CROSS_COMPILE_ROOT_PATH}") -elseif(DEFINED CROSS_COMPILE_ROOT) - set(CROSS_COMPILE_ROOT_PATH "${CROSS_COMPILE_ROOT}") - message(STATUS "Using CROSS_COMPILE_ROOT from CMake variable: ${CROSS_COMPILE_ROOT_PATH}") -else() - message(FATAL_ERROR "CROSS_COMPILE_ROOT is not defined. Please set it either as an environment variable or CMake variable to your cross-compiler root directory. A guide can be found here: https://github.com/abhiTronix/raspberry-pi-cross-compilers/discussions/123") +if(DEFINED $ENV{CROSS_COMPILE_ROOT}) + set(CROSS_COMPILE_DIR $ENV{CROSS_COMPILE_ROOT}) endif() -# Include the PI toolchain file directly from the resolved path -include("${CROSS_COMPILE_ROOT_PATH}/PI.cmake") +# Check if the cross-compile directory exists +if(NOT EXISTS "${CROSS_COMPILE_DIR}") + if(DEFINED $ENV{CROSS_COMPILE_ROOT}) + message(FATAL_ERROR "CROSS_COMPILE_DIR was defined in env but does not exist.") + endif() + + message(STATUS "Cross-compile directory not found. Downloading and extracting...") + file(DOWNLOAD + "https://github.com/sshcrack/led-matrix/releases/download/v0.0.1-beta/cross-compile.tar.xz" + "${LED_MATRIX_BUILD_DIR}/cross-compile.tar.xz" + SHOW_PROGRESS + ) + + file(MAKE_DIRECTORY "${CROSS_COMPILE_DIR}") + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar -xf "${LED_MATRIX_BUILD_DIR}/cross-compile.tar.xz" + WORKING_DIRECTORY "${CROSS_COMPILE_DIR}" + ) +endif() + +# Include the PI toolchain file from the extracted directory +include("${CROSS_COMPILE_DIR}/PI.cmake") diff --git a/cmake/triplets/arm64-rpi.cmake b/cmake/triplets/arm64-rpi.cmake new file mode 100644 index 00000000..cb2bc013 --- /dev/null +++ b/cmake/triplets/arm64-rpi.cmake @@ -0,0 +1,7 @@ +set(VCPKG_TARGET_ARCHITECTURE arm64) +set(VCPKG_CRT_LINKAGE dynamic) +set(VCPKG_LIBRARY_LINKAGE static) + +set(VCPKG_CMAKE_SYSTEM_NAME Linux) + +set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${CMAKE_CURRENT_LIST_DIR}/../PI.cmake")