Skip to content

Commit b1a66bb

Browse files
Refactor toolchains to support GCC version via env var
Updated aarch64 and x86_64 CMake toolchain files to select GCC version using the LINUX_GCC_VERSION environment variable, simplifying and unifying compiler selection. Modified linux_build.sh to export LINUX_GCC_VERSION for both native and cross-compilation, and to only update alternatives for native builds. This improves cross-compilation flexibility and reduces manual configuration.
1 parent b7fc580 commit b1a66bb

File tree

6 files changed

+61
-83
lines changed

6 files changed

+61
-83
lines changed
Lines changed: 14 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,27 @@
11
# CMake toolchain file for cross-compiling to ARM64 (aarch64) on Debian/Ubuntu
22
# Usage: cmake -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/aarch64-linux-gnu.cmake
33

4-
# The name of the target operating system
54
set(CMAKE_SYSTEM_NAME Linux)
6-
7-
# Set processor type
85
set(CMAKE_SYSTEM_PROCESSOR aarch64)
96

10-
# Set compiler prefix
11-
set(COMPILER_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-linux-gnu)
7+
# Use GCC version from environment variable if available
8+
if(DEFINED ENV{LINUX_GCC_VERSION}) # cmake-lint: disable=W0106
9+
set(LINUX_GCC_VERSION "-$ENV{LINUX_GCC_VERSION}")
10+
else()
11+
set(LINUX_GCC_VERSION "") # default to no version suffix
12+
endif()
13+
14+
# Set compiler prefix and target
15+
set(CMAKE_C_COMPILER_TARGET ${CMAKE_SYSTEM_PROCESSOR}-linux-gnu)
16+
set(CMAKE_CXX_COMPILER_TARGET ${CMAKE_C_COMPILER_TARGET})
1217

1318
# Which compilers to use for C and C++
14-
set(CMAKE_C_COMPILER ${COMPILER_PREFIX}-gcc)
15-
set(CMAKE_CXX_COMPILER ${COMPILER_PREFIX}-g++)
16-
set(CMAKE_ASM_COMPILER ${COMPILER_PREFIX}-gcc)
19+
set(CMAKE_C_COMPILER ${CMAKE_C_COMPILER_TARGET}-gcc${LINUX_GCC_VERSION})
20+
set(CMAKE_CXX_COMPILER ${CMAKE_C_COMPILER_TARGET}-g++${LINUX_GCC_VERSION})
21+
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER_TARGET}-gcc${LINUX_GCC_VERSION})
1722

1823
# Here is the target environment located
19-
set(CMAKE_FIND_ROOT_PATH /usr/${COMPILER_PREFIX})
20-
21-
# Adjust the default behavior of the FIND_XXX() commands:
22-
# search headers and libraries in the target environment, search
23-
# programs in the host environment
24-
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
25-
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
26-
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
27-
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
28-
29-
# Set pkg-config environment for cross-compilation
30-
set(ENV{PKG_CONFIG_PATH} "/usr/lib/${COMPILER_PREFIX}/pkgconfig:/usr/share/pkgconfig")
31-
set(ENV{PKG_CONFIG_LIBDIR} "/usr/lib/${COMPILER_PREFIX}/pkgconfig:/usr/share/pkgconfig")
32-
set(ENV{PKG_CONFIG_SYSROOT_DIR} "/usr/${COMPILER_PREFIX}")
33-
34-
# Set compiler flags for cross-compilation
35-
set(CMAKE_C_FLAGS_INIT "-march=armv8-a")
36-
set(CMAKE_CXX_FLAGS_INIT "-march=armv8-a")
37-
38-
# Explicitly set OpenSSL paths for cross-compilation
39-
set(OPENSSL_ROOT_DIR "/usr/${COMPILER_PREFIX}")
40-
set(OPENSSL_INCLUDE_DIR "/usr/${COMPILER_PREFIX}/include")
41-
set(OPENSSL_CRYPTO_LIBRARY "/usr/${COMPILER_PREFIX}/lib/libcrypto.so")
42-
set(OPENSSL_SSL_LIBRARY "/usr/${COMPILER_PREFIX}/lib/libssl.so")
43-
44-
# Additional library paths
45-
set(CMAKE_LIBRARY_PATH "/usr/${COMPILER_PREFIX}/lib" ${CMAKE_LIBRARY_PATH})
46-
set(CMAKE_INCLUDE_PATH "/usr/${COMPILER_PREFIX}/include" ${CMAKE_INCLUDE_PATH})
24+
set(CMAKE_FIND_ROOT_PATH /usr/${CMAKE_C_COMPILER_TARGET})
4725

4826
# Packaging
4927
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}")
Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,27 @@
11
# CMake toolchain file for cross-compiling to x86_64 on Debian/Ubuntu
22
# Usage: cmake -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/x86_64-linux-gnu.cmake
33

4-
# The name of the target operating system
54
set(CMAKE_SYSTEM_NAME Linux)
6-
7-
# Set processor type
85
set(CMAKE_SYSTEM_PROCESSOR x86_64)
96

10-
# Set compiler prefix
11-
set(COMPILER_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-linux-gnu)
7+
# Use GCC version from environment variable if available
8+
if(DEFINED ENV{LINUX_GCC_VERSION}) # cmake-lint: disable=W0106
9+
set(LINUX_GCC_VERSION "-$ENV{LINUX_GCC_VERSION}")
10+
else()
11+
set(LINUX_GCC_VERSION "") # default to no version suffix
12+
endif()
13+
14+
# Set compiler prefix and target
15+
set(CMAKE_C_COMPILER_TARGET ${CMAKE_SYSTEM_PROCESSOR}-linux-gnu)
16+
set(CMAKE_CXX_COMPILER_TARGET ${CMAKE_C_COMPILER_TARGET})
1217

1318
# Which compilers to use for C and C++
14-
set(CMAKE_C_COMPILER ${COMPILER_PREFIX}-gcc)
15-
set(CMAKE_CXX_COMPILER ${COMPILER_PREFIX}-g++)
16-
set(CMAKE_ASM_COMPILER ${COMPILER_PREFIX}-gcc)
19+
set(CMAKE_C_COMPILER ${CMAKE_C_COMPILER_TARGET}-gcc${LINUX_GCC_VERSION})
20+
set(CMAKE_CXX_COMPILER ${CMAKE_C_COMPILER_TARGET}-g++${LINUX_GCC_VERSION})
21+
set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER_TARGET}-gcc${LINUX_GCC_VERSION})
1722

1823
# Here is the target environment located
19-
set(CMAKE_FIND_ROOT_PATH /usr/${COMPILER_PREFIX})
20-
21-
# Adjust the default behavior of the FIND_XXX() commands:
22-
# search headers and libraries in the target environment, search
23-
# programs in the host environment
24-
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
25-
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
26-
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
27-
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
28-
29-
# Set pkg-config environment for cross-compilation
30-
set(ENV{PKG_CONFIG_PATH} "/usr/lib/${COMPILER_PREFIX}/pkgconfig:/usr/share/pkgconfig")
31-
set(ENV{PKG_CONFIG_LIBDIR} "/usr/lib/${COMPILER_PREFIX}/pkgconfig:/usr/share/pkgconfig")
32-
set(ENV{PKG_CONFIG_SYSROOT_DIR} "/usr/${COMPILER_PREFIX}")
33-
34-
# Explicitly set OpenSSL paths for cross-compilation
35-
set(OPENSSL_ROOT_DIR "/usr/${COMPILER_PREFIX}")
36-
set(OPENSSL_INCLUDE_DIR "/usr/${COMPILER_PREFIX}/include")
37-
set(OPENSSL_CRYPTO_LIBRARY "/usr/${COMPILER_PREFIX}/lib/libcrypto.so")
38-
set(OPENSSL_SSL_LIBRARY "/usr/${COMPILER_PREFIX}/lib/libssl.so")
39-
40-
# Additional library paths
41-
set(CMAKE_LIBRARY_PATH "/usr/${COMPILER_PREFIX}/lib" ${CMAKE_LIBRARY_PATH})
42-
set(CMAKE_INCLUDE_PATH "/usr/${COMPILER_PREFIX}/include" ${CMAKE_INCLUDE_PATH})
24+
set(CMAKE_FIND_ROOT_PATH /usr/${CMAKE_C_COMPILER_TARGET})
4325

4426
# Packaging
4527
set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}")

docker/debian-trixie.dockerfile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# artifacts: true
33
# platforms: linux/amd64,linux/arm64/v8
44
# platforms_pr: linux/amd64,linux/arm64/v8
5-
# no-cache-filters: sunshine-base,artifacts,sunshine
5+
# no-cache-filters: sunshine-base,sunshine-deps,artifacts,sunshine
66
ARG BASE=debian
77
ARG TAG=trixie
88
FROM ${BASE}:${TAG} AS sunshine-base
@@ -58,6 +58,7 @@ else
5858
echo "Native compilation for ${TARGETPLATFORM}"
5959
fi
6060

61+
echo "Running dependency installation step..."
6162
./scripts/linux_build.sh \
6263
--step=deps \
6364
--cuda-patches \
@@ -67,6 +68,7 @@ fi
6768
${target_tuple:+--target-tuple=${target_tuple}}
6869
apt-get clean
6970
rm -rf /var/lib/apt/lists/*
71+
echo "Dependency installation completed."
7072
_DEPS
7173

7274
FROM --platform=$BUILDPLATFORM sunshine-deps AS sunshine-build

docker/ubuntu-22.04.dockerfile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# artifacts: true
33
# platforms: linux/amd64,linux/arm64/v8
44
# platforms_pr: linux/amd64,linux/arm64/v8
5-
# no-cache-filters: sunshine-base,artifacts,sunshine
5+
# no-cache-filters: sunshine-base,sunshine-deps,artifacts,sunshine
66
ARG BASE=ubuntu
77
ARG TAG=22.04
88
FROM ${BASE}:${TAG} AS sunshine-base
@@ -57,6 +57,7 @@ else
5757
echo "Native compilation for ${TARGETPLATFORM}"
5858
fi
5959

60+
echo "Running dependency installation step..."
6061
./scripts/linux_build.sh \
6162
--step=deps \
6263
--ubuntu-test-repo \
@@ -66,6 +67,7 @@ fi
6667
${target_tuple:+--target-tuple=${target_tuple}}
6768
apt-get clean
6869
rm -rf /var/lib/apt/lists/*
70+
echo "Dependency installation completed."
6971
_DEPS
7072

7173
FROM --platform=$BUILDPLATFORM sunshine-deps AS sunshine-build

docker/ubuntu-24.04.dockerfile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# artifacts: true
33
# platforms: linux/amd64,linux/arm64/v8
44
# platforms_pr: linux/amd64,linux/arm64/v8
5-
# no-cache-filters: sunshine-base,artifacts,sunshine
5+
# no-cache-filters: sunshine-base,sunshine-deps,artifacts,sunshine
66
ARG BASE=ubuntu
77
ARG TAG=24.04
88
FROM ${BASE}:${TAG} AS sunshine-base
@@ -57,6 +57,7 @@ else
5757
echo "Native compilation for ${TARGETPLATFORM}"
5858
fi
5959

60+
echo "Running dependency installation step..."
6061
./scripts/linux_build.sh \
6162
--step=deps \
6263
--sudo-off \
@@ -65,6 +66,7 @@ fi
6566
${target_tuple:+--target-tuple=${target_tuple}}
6667
apt-get clean
6768
rm -rf /var/lib/apt/lists/*
69+
echo "Dependency installation completed."
6870
_DEPS
6971

7072
FROM --platform=$BUILDPLATFORM sunshine-deps AS sunshine-build

scripts/linux_build.sh

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -521,19 +521,26 @@ function run_step_deps() {
521521
export CC=gcc-14
522522
export CXX=g++-14
523523
elif [ "$distro" == "debian" ] || [ "$distro" == "ubuntu" ]; then
524-
for file in "${gcc_alternative_files[@]}"; do
525-
file_path="/etc/alternatives/$file"
526-
if [ -e "$file_path" ]; then
527-
${sudo_cmd} mv "$file_path" "$file_path.bak"
528-
fi
529-
done
524+
# Export GCC version for toolchain files
525+
export LINUX_GCC_VERSION="$gcc_version"
530526

531-
${sudo_cmd} update-alternatives --install \
532-
/usr/bin/gcc gcc /usr/bin/gcc-${gcc_version} 100 \
533-
--slave /usr/bin/g++ g++ /usr/bin/g++-${gcc_version} \
534-
--slave /usr/bin/gcov gcov /usr/bin/gcov-${gcc_version} \
535-
--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-${gcc_version} \
536-
--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-${gcc_version}
527+
# Only set up alternatives for native compilation
528+
# For cross-compilation, the toolchain files will handle compiler selection
529+
if [ "$cross_compile" == 0 ]; then
530+
for file in "${gcc_alternative_files[@]}"; do
531+
file_path="/etc/alternatives/$file"
532+
if [ -e "$file_path" ]; then
533+
${sudo_cmd} mv "$file_path" "$file_path.bak"
534+
fi
535+
done
536+
537+
${sudo_cmd} update-alternatives --install \
538+
/usr/bin/gcc gcc /usr/bin/gcc-${gcc_version} 100 \
539+
--slave /usr/bin/g++ g++ /usr/bin/g++-${gcc_version} \
540+
--slave /usr/bin/gcov gcov /usr/bin/gcov-${gcc_version} \
541+
--slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-${gcc_version} \
542+
--slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-${gcc_version}
543+
fi
537544
fi
538545

539546
# compile cmake if the version is too low
@@ -596,6 +603,11 @@ function run_step_cmake() {
596603
# Setup NVM environment if needed (for web UI builds)
597604
setup_nvm_environment
598605

606+
# Export GCC version for toolchain files (in case it wasn't set in deps step)
607+
if [ "$distro" == "debian" ] || [ "$distro" == "ubuntu" ]; then
608+
export LINUX_GCC_VERSION="$gcc_version"
609+
fi
610+
599611
# Detect CUDA path using the reusable function
600612
nvcc_path=""
601613
if [ "$skip_cuda" == 0 ]; then

0 commit comments

Comments
 (0)