diff --git a/CMakeLists.txt b/CMakeLists.txt index 2128ea7..a3dc3cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,12 +46,23 @@ list(APPEND ARM_ARCH_MAJOR_LIST 8 9) list(APPEND ACS_LIST "bsa" "sbsa" "pc_bsa") ### -set(CROSS_COMPILE $ENV{CROSS_COMPILE}) -# Set default only if not defined externally -if(NOT DEFINED CROSS_COMPILE) - message(FATAL_ERROR "CROSS_COMPILE not defined. Exiting.") +# Prefer the toolchain file to validate and set `CROSS_COMPILE`. +# If no toolchain file is provided, require `CROSS_COMPILE` from the +# environment to support local cross-configures. +if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) + if(NOT DEFINED CROSS_COMPILE) + set(CROSS_COMPILE $ENV{CROSS_COMPILE}) + endif() + + if(NOT DEFINED CROSS_COMPILE OR "${CROSS_COMPILE}" STREQUAL "") + message(FATAL_ERROR "CROSS_COMPILE not defined. Please set CROSS_COMPILE or use -DCMAKE_TOOLCHAIN_FILE=.") + endif() endif() +# NOTE: cross-toolchain selection is handled by an explicit toolchain file +# (`tools/cmake/toolchain/arm-none-elf-toolchain.cmake`). Users should +# configure with `-DCMAKE_TOOLCHAIN_FILE=...` to avoid host-specific flags. + # Check for valid targets _get_sub_dir_list(TARGET_LIST ${ROOT_DIR}/pal/baremetal/target/) if(NOT DEFINED TARGET) @@ -62,8 +73,6 @@ endif() if(NOT ${TARGET} IN_LIST TARGET_LIST) message(FATAL_ERROR "[ACS] : Error: Unspported value for -DTARGET=, supported targets are : ${TARGET_LIST}") -else() - message(STATUS "[ACS] : TARGET is set to ${TARGET}") endif() # Check for ARM_ARCH_MAJOR @@ -101,24 +110,25 @@ foreach(clean_item ${CLEAN_LIST}) endforeach() ### -# Custom targets to trigger bsa and sbsa builds -add_custom_target(bsa - COMMAND ${CMAKE_COMMAND} -DACS=bsa -DTARGET=${TARGET} -S ${CMAKE_SOURCE_DIR} -B ${CMAKE_BINARY_DIR}/bsa_build - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/bsa_build -) - -add_custom_target(sbsa - COMMAND ${CMAKE_COMMAND} -DACS=sbsa -DTARGET=${TARGET} -S ${CMAKE_SOURCE_DIR} -B ${CMAKE_BINARY_DIR}/sbsa_build - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/sbsa_build -) +# Generate per-ACS custom targets and an aggregate target +foreach(_acs IN LISTS ACS_LIST) + add_custom_target(${_acs} + COMMAND ${CMAKE_COMMAND} -DACS=${_acs} -DTARGET=${TARGET} -DCMAKE_OSX_ARCHITECTURES= -DCMAKE_TOOLCHAIN_FILE=${ROOT_DIR}/tools/cmake/toolchain/arm-none-elf-toolchain.cmake -S ${CMAKE_SOURCE_DIR} -B ${CMAKE_BINARY_DIR}/${_acs}_build + COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/${_acs}_build + ) +endforeach() -add_custom_target(pc_bsa - COMMAND ${CMAKE_COMMAND} -DACS=pc_bsa -DTARGET=${TARGET} -S ${CMAKE_SOURCE_DIR} -B ${CMAKE_BINARY_DIR}/pc_bsa_build - COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/pc_bsa_build +add_custom_target(acs_all + DEPENDS ${ACS_LIST} ) if(ACS IN_LIST ACS_LIST) - message(STATUS "[ACS] : ACS is set to ${ACS}") + message(STATUS "[ACS] : ACS is set to ${ACS}, and TAREGT to ${TARGET} based on configuration") + message(STATUS "[ACS] : You can change overide configuration using -DACS= or -DTARGET=") + message(STATUS "[ACS] : Supported values are ACS: ${ACS_LIST}, TARGET: ${TARGET_LIST}") + message(STATUS "[ACS] : Example - cmake --preset baremetal -DACS=sbsa -DTARGET=RDV3") + message(STATUS "[ACS] : To build using cmake - 'cmake --build --preset baremetal") + message(STATUS "[ACS] : To build using make - 'cd build; make bsa' - here TARGET reconfigure not required, all targets supported") add_subdirectory(${ROOT_DIR}/tools/cmake/infra) endif() diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 0000000..a54fbc7 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,25 @@ +{ + "version": 3, + "cmakeMinimumRequired": { "major": 3, "minor": 19, "patch": 0 }, + "configurePresets": [ + { + "name": "baremetal", + "displayName": "Configure: aarch64-none-elf (baremetal)", + "generator": "Unix Makefiles", + "binaryDir": "${sourceDir}/build", + "cacheVariables": { + "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/tools/cmake/toolchain/arm-none-elf-toolchain.cmake", + "CMAKE_OSX_ARCHITECTURES": "", + "ACS": "bsa", + "TARGET": "RDN2" + } + } + ], + "buildPresets": [ + { + "name": "baremetal", + "configurePreset": "baremetal", + "jobs": 8 + } + ] +} \ No newline at end of file diff --git a/tools/cmake/toolchain/arm-none-elf-toolchain.cmake b/tools/cmake/toolchain/arm-none-elf-toolchain.cmake new file mode 100644 index 0000000..6cbda35 --- /dev/null +++ b/tools/cmake/toolchain/arm-none-elf-toolchain.cmake @@ -0,0 +1,44 @@ +## @file + # Copyright (c) 2025, Arm Limited or its affiliates. All rights reserved. + # SPDX-License-Identifier : Apache-2.0 + # + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + ## + +# Minimal toolchain for aarch64-none-elf cross builds +# Set system name early to avoid passing -arch compiler options on macOS +set(CMAKE_SYSTEM_NAME Generic CACHE STRING "Cross compile system" FORCE) + +# Disable -arch flags on macOS +set(CMAKE_OSX_ARCHITECTURES "" CACHE STRING "Disable -arch flags for cross compile" FORCE) + +# Pull CROSS_COMPILE from environment if not provided +if(NOT DEFINED CROSS_COMPILE) + if(DEFINED ENV{CROSS_COMPILE}) + set(CROSS_COMPILE $ENV{CROSS_COMPILE}) + endif() +endif() + +if(NOT DEFINED CROSS_COMPILE OR "${CROSS_COMPILE}" STREQUAL "") + message(FATAL_ERROR "CROSS_COMPILE not defined in environment. Please set CROSS_COMPILE to your toolchain prefix.") +endif() + +set(CMAKE_C_COMPILER "${CROSS_COMPILE}gcc" CACHE FILEPATH "C compiler" FORCE) +set(CMAKE_ASM_COMPILER "${CMAKE_C_COMPILER}" CACHE FILEPATH "ASM compiler" FORCE) +set(CMAKE_AR "${CROSS_COMPILE}ar" CACHE FILEPATH "Archiver" FORCE) +set(CMAKE_OBJCOPY "${CROSS_COMPILE}objcopy" CACHE FILEPATH "Objcopy" FORCE) +set(CMAKE_OBJDUMP "${CROSS_COMPILE}objdump" CACHE FILEPATH "Objdump" FORCE) +set(CMAKE_RANLIB "${CROSS_COMPILE}ranlib" CACHE FILEPATH "Ranlib" FORCE) + +# Ensure baremetal sources get appropriate platform macro +add_definitions(-DTARGET_BAREMETAL) diff --git a/tools/cmake/toolchain/common.cmake b/tools/cmake/toolchain/common.cmake index 533ac31..70fe86c 100644 --- a/tools/cmake/toolchain/common.cmake +++ b/tools/cmake/toolchain/common.cmake @@ -52,7 +52,15 @@ endif() set(LINKER_FILE "${ROOT_DIR}/tools/cmake/toolchain/linker.cmake") set(CROSS_COMPILE ${CROSS_COMPILE} CACHE INTERNAL "CROSS_COMPILE is set to ${CROSS_COMPILE}" FORCE) -set(CMAKE_C_COMPILER ${CMAKE_C_COMPILER} CACHE INTERNAL "CMAKE_C_COMPILER is set to ${CMAKE_C_COMPILER}" FORCE) +# Only populate the cache entry for `CMAKE_C_COMPILER` if it isn't +# already set by a toolchain file or the cache. Avoid FORCE to prevent +# overwriting a value the user or toolchain provided. +set(CMAKE_C_COMPILER ${CMAKE_C_COMPILER} CACHE INTERNAL "CMAKE_C_COMPILER is set to ${CMAKE_C_COMPILER}" FORCE) -include(${COMPILER_FILE}) -include(${LINKER_FILE}) +if(DEFINED COMPILER_FILE) + include(${COMPILER_FILE}) +endif() + +if(DEFINED LINKER_FILE) + include(${LINKER_FILE}) +endif() diff --git a/tools/cmake/toolchain/gnuarm.cmake b/tools/cmake/toolchain/gnuarm.cmake index b4e2e29..472c2ce 100644 --- a/tools/cmake/toolchain/gnuarm.cmake +++ b/tools/cmake/toolchain/gnuarm.cmake @@ -32,6 +32,8 @@ else() set(TARGET_SWITCH "-march=armv${ARM_ARCH_MAJOR}.${ARM_ARCH_MINOR}-a+sve+profile") endif() +message(STATUS "[ACS] : TARGET_SWITCH is set to ${TARGET_SWITCH}") + if(${ENABLE_PIE}) set(COMPILE_PIE_SWITCH "-fpie") add_definitions(-DENABLE_PIE)