forked from ROMEO/obsw
220 lines
8.3 KiB
CMake
220 lines
8.3 KiB
CMake
# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
option(NON_YOCTO "Non Yocto embeddedsw FLOW" OFF)
|
|
set(CMAKE_POLICY_DEFAULT_CMP0140 OLD)
|
|
|
|
set (CMAKE_INSTALL_LIBDIR "lib")
|
|
function (collector_create name base)
|
|
set_property (GLOBAL PROPERTY "COLLECT_${name}_LIST")
|
|
set_property (GLOBAL PROPERTY "COLLECT_${name}_BASE" "${base}")
|
|
endfunction (collector_create)
|
|
|
|
function (collector_list var name)
|
|
get_property (_list GLOBAL PROPERTY "COLLECT_${name}_LIST")
|
|
set (${var} "${_list}" PARENT_SCOPE)
|
|
endfunction (collector_list)
|
|
|
|
function (collector_base var name)
|
|
get_property (_base GLOBAL PROPERTY "COLLECT_${name}_BASE")
|
|
set (${var} "${_base}" PARENT_SCOPE)
|
|
endfunction (collector_base)
|
|
|
|
function (collect name)
|
|
collector_base (_base ${name})
|
|
string(COMPARE NOTEQUAL "${_base}" "" _is_rel)
|
|
set (_list)
|
|
foreach (s IN LISTS ARGN)
|
|
if (_is_rel)
|
|
get_filename_component (s "${s}" ABSOLUTE)
|
|
file (RELATIVE_PATH s "${_base}" "${s}")
|
|
endif (_is_rel)
|
|
list (APPEND _list "${s}")
|
|
endforeach ()
|
|
set_property (GLOBAL APPEND PROPERTY "COLLECT_${name}_LIST" "${_list}")
|
|
endfunction (collect)
|
|
|
|
function(LIST_INDEX index match PROP)
|
|
foreach (prop ${PROP})
|
|
if ("${prop}" STREQUAL "${match}")
|
|
set(index ${index} PARENT_SCOPE)
|
|
return()
|
|
endif()
|
|
MATH(EXPR index "${index}+1")
|
|
endforeach()
|
|
endfunction()
|
|
|
|
function(get_headers headers)
|
|
foreach(header ${_headers})
|
|
string(REPLACE "/" ";" PATH_LIST ${header})
|
|
list(GET PATH_LIST -1 header)
|
|
list(APPEND clean_headers ${CMAKE_INCLUDE_PATH}/${header})
|
|
set(clean_headers ${clean_headers} PARENT_SCOPE)
|
|
endforeach()
|
|
return(${clean_headers})
|
|
endfunction()
|
|
|
|
macro(subdirlist result curdir)
|
|
file(GLOB subdirs RELATIVE ${curdir} ${curdir}/*)
|
|
set(dirlist "")
|
|
foreach(subdir ${subdirs})
|
|
if(IS_DIRECTORY ${curdir}/${subdir})
|
|
list(APPEND dirlist ${subdir})
|
|
endif()
|
|
endforeach()
|
|
set(${result} ${dirlist})
|
|
endmacro()
|
|
|
|
function (linker_gen path)
|
|
if (NOT EXISTS "${CMAKE_SOURCE_DIR}/lscript.ld")
|
|
if (NOT DEFINED STACK_SIZE)
|
|
if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "microblaze")
|
|
set(STACK_SIZE 0x400)
|
|
else()
|
|
set(STACK_SIZE 0x2000)
|
|
endif()
|
|
endif()
|
|
if (NOT DEFINED HEAP_SIZE)
|
|
if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "microblaze")
|
|
set(HEAP_SIZE 0x400)
|
|
else()
|
|
set(HEAP_SIZE 0x2000)
|
|
endif()
|
|
endif()
|
|
SET(MEM_NODE_INSTANCES "${TOTAL_MEM_CONTROLLERS}" CACHE STRING "Memory Controller")
|
|
SET_PROPERTY(CACHE MEM_NODE_INSTANCES PROPERTY STRINGS "${TOTAL_MEM_CONTROLLERS}")
|
|
set(CUSTOM_LINKER_FILE "None" CACHE STRING "Custom Linker Script")
|
|
list(LENGTH MEM_NODE_INSTANCES _len)
|
|
if (${_len} EQUAL 1)
|
|
set(DDR ${MEM_NODE_INSTANCES})
|
|
endif()
|
|
if(("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortexa72")
|
|
OR ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortexa78")
|
|
OR ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortexa53")
|
|
OR ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortexa53-32")
|
|
OR ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64"))
|
|
configure_file(${path}/lscript_a53.ld.in ${CMAKE_SOURCE_DIR}/lscript.ld)
|
|
list(APPEND LINKER_FILE_PATH ${path}/lscript_a53.ld.in)
|
|
list(APPEND LINKER_FILE lscript_a53.ld.in)
|
|
endif()
|
|
|
|
if(("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "microblaze") OR
|
|
("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "microblazeel") OR
|
|
("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "plm_microblaze") OR
|
|
("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "pmu_microblaze"))
|
|
configure_file(${path}/lscript_mb.ld.in ${CMAKE_SOURCE_DIR}/lscript.ld)
|
|
list(APPEND LINKER_FILE_PATH ${path}/lscript_mb.ld.in)
|
|
list(APPEND LINKER_FILE lscript_mb.ld.in)
|
|
endif()
|
|
|
|
if(("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortexr5"))
|
|
if("${CMAKE_MACHINE}" STREQUAL "Versal")
|
|
configure_file(${path}/lscript_versal_r5.ld.in ${CMAKE_SOURCE_DIR}/lscript.ld)
|
|
list(APPEND LINKER_FILE_PATH ${path}/lscript_versal_r5.ld.in)
|
|
list(APPEND LINKER_FILE lscript_versal_r5.ld.in)
|
|
else()
|
|
configure_file(${path}/lscript_r5.ld.in ${CMAKE_SOURCE_DIR}/lscript.ld)
|
|
list(APPEND LINKER_FILE_PATH ${path}/lscript_r5.ld.in)
|
|
list(APPEND LINKER_FILE lscript_r5.ld.in)
|
|
endif()
|
|
endif()
|
|
|
|
if(("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortexr52"))
|
|
configure_file(${path}/lscript_versal_net_r5.ld.in ${CMAKE_SOURCE_DIR}/lscript.ld)
|
|
list(APPEND LINKER_FILE_PATH ${path}/lscript_versal_net_r5.ld.in)
|
|
list(APPEND LINKER_FILE lscript_versal_net_r5.ld.in)
|
|
endif()
|
|
|
|
if(("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortexa9"))
|
|
configure_file(${path}/lscript_a9.ld.in ${CMAKE_SOURCE_DIR}/lscript.ld)
|
|
list(APPEND LINKER_FILE_PATH ${path}/lscript_a9.ld.in)
|
|
list(APPEND LINKER_FILE lscript_a9.ld.in)
|
|
endif()
|
|
|
|
if (NOT "${CUSTOM_LINKER_FILE}" STREQUAL "None")
|
|
execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${CUSTOM_LINKER_FILE} ${CMAKE_SOURCE_DIR}/)
|
|
endif()
|
|
if (${NON_YOCTO})
|
|
file (REMOVE_RECURSE ${path})
|
|
endif()
|
|
endif()
|
|
endfunction(linker_gen)
|
|
|
|
function(gen_exheader path drvname addr prefix)
|
|
string(TOUPPER ${drvname} DRVNAME)
|
|
set(ADDR_DEFINE "#define X${DRVNAME}_BASEADDRESS ${addr}U")
|
|
|
|
if (NOT ${prefix})
|
|
set(DRVNAME X${DRVNAME})
|
|
configure_file(${path}/example.h.in ${CMAKE_SOURCE_DIR}/${prefix}${drvname}_example.h)
|
|
else()
|
|
configure_file(${path}/example.h.in ${CMAKE_SOURCE_DIR}/${drvname}_example.h)
|
|
endif()
|
|
endfunction(gen_exheader)
|
|
|
|
function(gen_bspconfig)
|
|
execute_process(COMMAND lopper $ENV{SYSTEM_DTFILE} -- baremetal_bspconfig_xlnx ${ESW_MACHINE} ${CMAKE_SOURCE_DIR}
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/common
|
|
RESULT_VARIABLE output)
|
|
execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/common/MemConfig.cmake ${CMAKE_SOURCE_DIR}/MemConfig.cmake)
|
|
endfunction(gen_bspconfig)
|
|
|
|
function(get_drvlist)
|
|
execute_process(COMMAND lopper $ENV{SYSTEM_DTFILE} -- baremetaldrvlist_xlnx ${ESW_MACHINE} ${CMAKE_SOURCE_DIR}/../../
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
RESULT_VARIABLE output)
|
|
endfunction(get_drvlist)
|
|
|
|
function(gen_drvconfig drvname)
|
|
if ("${drvname}" STREQUAL "uartps" OR
|
|
"${drvname}" STREQUAL "uartlite" OR
|
|
"${drvname}" STREQUAL "uartpsv")
|
|
execute_process(COMMAND lopper $ENV{SYSTEM_DTFILE} -- baremetalconfig_xlnx ${ESW_MACHINE} ${CMAKE_SOURCE_DIR}/${drvname}/src/ stdin
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/${drvname}/src/
|
|
RESULT_VARIABLE output)
|
|
else()
|
|
execute_process(COMMAND lopper $ENV{SYSTEM_DTFILE} -- baremetalconfig_xlnx ${ESW_MACHINE} ${CMAKE_SOURCE_DIR}/${drvname}/src/
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/${drvname}/src/
|
|
RESULT_VARIABLE output)
|
|
endif()
|
|
endfunction(gen_drvconfig)
|
|
|
|
function(gen_xparams)
|
|
execute_process(COMMAND lopper $ENV{SYSTEM_DTFILE} -- baremetal_xparameters_xlnx ${ESW_MACHINE} ${CMAKE_SOURCE_DIR}/../../
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
RESULT_VARIABLE output)
|
|
endfunction(gen_xparams)
|
|
|
|
function(gen_linker)
|
|
execute_process(COMMAND lopper $ENV{SYSTEM_DTFILE} -- baremetallinker_xlnx ${ESW_MACHINE} ${CMAKE_SOURCE_DIR}/
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
RESULT_VARIABLE output)
|
|
endfunction(gen_linker)
|
|
|
|
function(gen_libconfig)
|
|
execute_process(COMMAND lopper $ENV{SYSTEM_DTFILE} -- bmcmake_metadata_xlnx.py ${ESW_MACHINE} ${CMAKE_SOURCE_DIR}/ hwcmake_metadata ${CMAKE_SOURCE_DIR}/../../../../
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
RESULT_VARIABLE output)
|
|
endfunction(gen_libconfig)
|
|
|
|
macro(print_elf_size size_command app_name)
|
|
if(DEFINED ${size_command})
|
|
add_custom_command(
|
|
TARGET ${app_name}.elf POST_BUILD
|
|
COMMAND ${${size_command}} --format=berkeley ${app_name}.elf
|
|
COMMAND ${${size_command}} --format=berkeley ${app_name}.elf > ${CMAKE_BINARY_DIR}/${app_name}.elf.size
|
|
VERBATIM)
|
|
endif()
|
|
endmacro()
|
|
|
|
function(find_project_type src_ext PROJECT_TYPE)
|
|
set(cpp_extensions ".cpp;.cc;.CPP;.c++;.cxx")
|
|
foreach(extension ${cpp_extensions})
|
|
if (${extension} IN_LIST src_ext)
|
|
set(PROJECT_TYPE "c++" PARENT_SCOPE)
|
|
return()
|
|
endif()
|
|
endforeach()
|
|
set(PROJECT_TYPE "c" PARENT_SCOPE)
|
|
endfunction()
|