Skip to content

Commit 224697d

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 224697d

File tree

3 files changed

+52
-80
lines changed

3 files changed

+52
-80
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})
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})
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}")

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)