# SPDX-License-Identifier: Apache-2.0 if(NOT SYSROOT_DIR) # When using cross-compile, the generic toolchain will be identical to the # target toolchain, hence let's ask the compiler if it knows its own sysroot. # Some gcc based compilers do have this information built-in. execute_process(COMMAND ${CMAKE_C_COMPILER} --print-sysroot RESULT_VARIABLE return_val OUTPUT_VARIABLE reported_sysroot OUTPUT_STRIP_TRAILING_WHITESPACE ) if(NOT return_val AND NOT "${reported_sysroot}" STREQUAL "") set(SYSROOT_DIR "${reported_sysroot}" CACHE INTERNAL "Sysroot reported by ${CMAKE_C_COMPILER}") else() # Let's try to lookup a sysroot. # Compiler is expected to be located in `bin/` so we go one folder up for search. cmake_path(GET CMAKE_C_COMPILER PARENT_PATH search_path) cmake_path(SET search_path NORMALIZE "${search_path}/..") file(GLOB_RECURSE libc_dirs RELATIVE ${search_path} ${search_path}/**/libc.a ) # Did we find any candidates ? list(LENGTH libc_dirs libc_dirs_length) if(${libc_dirs_length} GREATER 0) list(TRANSFORM libc_dirs REPLACE "libc.a$" "") list(SORT libc_dirs COMPARE NATURAL) list(GET libc_dirs 0 sysroot) set(sysroot_candidates ${sysroot}) foreach(dir ${libc_dirs}) string(FIND "${dir}" "${sysroot}" index) if(${index} EQUAL -1) set(sysroot ${dir}) list(APPEND sysroot_candidates ${sysroot}) endif() endforeach() # We detect the lib folders, the actual sysroot is up one level. list(TRANSFORM sysroot_candidates REPLACE "/lib[/]?$" "") list(LENGTH sysroot_candidates sysroot_candidates_length) if(sysroot_candidates_length GREATER 1) list(TRANSFORM sysroot_candidates PREPEND "${search_path}") string(REPLACE ";" "\n" sysroot_candidates_str "${sysroot_candidates}") message(WARNING "Multiple sysroot candidates found: ${sysroot_candidates_str}\n" "Use `-DSYSROOT_DIR=` to select sysroot.\n" ) endif() # Use first candidate as sysroot. list(GET sysroot_candidates 0 chosen_sysroot) cmake_path(SET SYSROOT_DIR NORMALIZE "${search_path}/${chosen_sysroot}") endif() if(SYSROOT_DIR) set(SYSROOT_DIR "${SYSROOT_DIR}" CACHE INTERNAL "Sysroot discovered") message(STATUS "Found sysroot: ${SYSROOT_DIR}") else() message(WARNING "No sysroot found, build may not work.\n" "Use `-DSYSROOT_DIR=` to specify sysroot to use.\n" ) endif() endif() endif()