168 lines
6.4 KiB
CMake
168 lines
6.4 KiB
CMake
|
# ##############################################################################
|
||
|
# cmake/nuttx_multiple_link.cmake
|
||
|
#
|
||
|
# SPDX-License-Identifier: Apache-2.0
|
||
|
#
|
||
|
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||
|
# license agreements. See the NOTICE file distributed with this work for
|
||
|
# additional information regarding copyright ownership. The ASF licenses this
|
||
|
# file to you 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.
|
||
|
#
|
||
|
# ##############################################################################
|
||
|
|
||
|
# create an empty allsyms source file for `nuttx`
|
||
|
if(CONFIG_ALLSYMS)
|
||
|
set(ALLSYMS_SOURCE ${CMAKE_BINARY_DIR}/allsyms_empty.c)
|
||
|
add_custom_command(
|
||
|
OUTPUT ${ALLSYMS_SOURCE}
|
||
|
COMMAND ${NUTTX_DIR}/tools/mkallsyms.py nuttx.empty ${ALLSYMS_SOURCE}
|
||
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||
|
COMMENT "Generating allsyms_empty.c")
|
||
|
add_custom_target(generate_empty_allsyms DEPENDS ${ALLSYMS_SOURCE})
|
||
|
add_dependencies(nuttx generate_empty_allsyms)
|
||
|
|
||
|
target_sources(nuttx PRIVATE ${ALLSYMS_SOURCE})
|
||
|
set(ALLSYMS_INCDIR ${CMAKE_SOURCE_DIR}/include ${CMAKE_BINARY_DIR}/include)
|
||
|
set_source_files_properties(${ALLSYMS_SOURCE} PROPERTIES INCLUDE_DIRECTORIES
|
||
|
"${ALLSYMS_INCDIR}")
|
||
|
endif()
|
||
|
|
||
|
if(CONFIG_MM_KASAN_GLOBAL)
|
||
|
set(KASAN_GLOBAL_SOURCE ${CMAKE_BINARY_DIR}/kasan_global.c)
|
||
|
add_custom_command(
|
||
|
OUTPUT ${KASAN_GLOBAL_SOURCE}
|
||
|
COMMAND ${NUTTX_DIR}/tools/kasan_global.py -e nuttx.empty -o
|
||
|
${KASAN_GLOBAL_SOURCE} -a ${CONFIG_MM_KASAN_GLOBAL_ALIGN}
|
||
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||
|
COMMENT "Generating kasan_global.c")
|
||
|
add_custom_target(generate_empty_kasan_global DEPENDS ${KASAN_GLOBAL_SOURCE})
|
||
|
add_dependencies(nuttx generate_empty_kasan_global)
|
||
|
|
||
|
target_sources(nuttx PRIVATE ${KASAN_GLOBAL_SOURCE})
|
||
|
set(KASAN_GLOBAL_INCDIR ${CMAKE_SOURCE_DIR}/include
|
||
|
${CMAKE_BINARY_DIR}/include)
|
||
|
set_source_files_properties(
|
||
|
${KASAN_GLOBAL_SOURCE} PROPERTIES INCLUDE_DIRECTORIES
|
||
|
"${KASAN_GLOBAL_INCDIR}")
|
||
|
endif()
|
||
|
|
||
|
# ~~~
|
||
|
# define_multiple_link_target
|
||
|
#
|
||
|
# Description:
|
||
|
# Wrapper of cmake declaration of nuttx executable
|
||
|
# in order to implement ALLSYMS.
|
||
|
#
|
||
|
# When declaring the target to be `nuttx`,
|
||
|
# create an empty allsyms source file for it;
|
||
|
# When the target is declared as something else,
|
||
|
# the link behavior of the `nuttx` target is cloned
|
||
|
# and added to actually generate the allsyms file.
|
||
|
#
|
||
|
# Parameters:
|
||
|
# inter_target : declaration of target
|
||
|
# dep_target : targets which depends on
|
||
|
# linktimes : link times of the target
|
||
|
# ~~~
|
||
|
|
||
|
macro(define_multiple_link_target inter_target dep_target linktimes)
|
||
|
set(MULTIPLE_LINK_SOURCES_${linktimes})
|
||
|
if(CONFIG_ALLSYMS)
|
||
|
set(LINK_ALLSYMS_SOURCE allsyms_${linktimes}.c)
|
||
|
list(APPEND MULTIPLE_LINK_SOURCES_${linktimes} ${LINK_ALLSYMS_SOURCE})
|
||
|
add_custom_command(
|
||
|
OUTPUT ${LINK_ALLSYMS_SOURCE} POST_BUILD
|
||
|
COMMAND ${NUTTX_DIR}/tools/mkallsyms.py ${CMAKE_BINARY_DIR}/${dep_target}
|
||
|
${LINK_ALLSYMS_SOURCE}
|
||
|
DEPENDS ${dep_target}
|
||
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||
|
COMMAND_EXPAND_LISTS)
|
||
|
endif()
|
||
|
|
||
|
if(CONFIG_MM_KASAN_GLOBAL)
|
||
|
set(LINK_KASAN_GLOBAL_SOURCE kasan_global_${linktimes}.c)
|
||
|
list(APPEND MULTIPLE_LINK_SOURCES_${linktimes} ${LINK_KASAN_GLOBAL_SOURCE})
|
||
|
add_custom_command(
|
||
|
OUTPUT ${LINK_KASAN_GLOBAL_SOURCE} POST_BUILD
|
||
|
COMMAND
|
||
|
${NUTTX_DIR}/tools/kasan_global.py -e ${CMAKE_BINARY_DIR}/${dep_target}
|
||
|
-o ${LINK_KASAN_GLOBAL_SOURCE} -a ${CONFIG_MM_KASAN_GLOBAL_ALIGN}
|
||
|
DEPENDS ${dep_target}
|
||
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||
|
COMMAND_EXPAND_LISTS)
|
||
|
endif()
|
||
|
|
||
|
# relink target with allsysm.c which generated by the elf of the previous
|
||
|
# phase
|
||
|
add_executable(
|
||
|
${inter_target}
|
||
|
${MULTIPLE_LINK_SOURCES_${linktimes}}
|
||
|
$<FILTER:$<TARGET_OBJECTS:nuttx>,EXCLUDE,allsyms_empty|kasan_global>)
|
||
|
|
||
|
# relink target and nuttx have exactly the same configuration
|
||
|
target_include_directories(
|
||
|
${inter_target} SYSTEM PUBLIC ${CMAKE_SOURCE_DIR}/include
|
||
|
${CMAKE_BINARY_DIR}/include)
|
||
|
target_compile_definitions(
|
||
|
${inter_target} PRIVATE $<TARGET_PROPERTY:nuttx,NUTTX_KERNEL_DEFINITIONS>)
|
||
|
target_compile_options(
|
||
|
${inter_target}
|
||
|
PRIVATE $<TARGET_PROPERTY:nuttx,NUTTX_KERNEL_COMPILE_OPTIONS>)
|
||
|
target_link_options(${inter_target} PRIVATE
|
||
|
$<TARGET_PROPERTY:nuttx,LINK_OPTIONS>)
|
||
|
target_link_libraries(
|
||
|
${inter_target}
|
||
|
PRIVATE $<TARGET_GENEX_EVAL:nuttx,$<TARGET_PROPERTY:nuttx,LINK_LIBRARIES>>)
|
||
|
endmacro()
|
||
|
|
||
|
# allsyms link phase 1 with generated allsyms source file
|
||
|
define_multiple_link_target(first_link nuttx first)
|
||
|
# allsyms link phase 2 since the table offset may changed
|
||
|
define_multiple_link_target(second_link first_link second)
|
||
|
# allsyms link phase 3 since the table offset may changed
|
||
|
define_multiple_link_target(final_nuttx second_link final)
|
||
|
|
||
|
# fixing timing dependencies
|
||
|
add_dependencies(nuttx_post final_nuttx)
|
||
|
# finally use final_nuttx to overwrite the already generated nuttx
|
||
|
add_custom_command(
|
||
|
TARGET final_nuttx
|
||
|
POST_BUILD
|
||
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different final_nuttx nuttx DEPENDS
|
||
|
final_nuttx
|
||
|
COMMENT "Overwrite nuttx with final_nuttx")
|
||
|
|
||
|
# regenerate binary outputs in different formats (.bin, .hex, etc)
|
||
|
if(CONFIG_INTELHEX_BINARY)
|
||
|
add_custom_command(
|
||
|
TARGET final_nuttx
|
||
|
POST_BUILD
|
||
|
COMMAND ${CMAKE_OBJCOPY} -O ihex final_nuttx nuttx.hex DEPENDS nuttx-hex
|
||
|
COMMENT "Regenerate nuttx.hex")
|
||
|
|
||
|
endif()
|
||
|
if(CONFIG_MOTOROLA_SREC)
|
||
|
add_custom_command(
|
||
|
TARGET final_nuttx
|
||
|
POST_BUILD
|
||
|
COMMAND ${CMAKE_OBJCOPY} -O srec final_nuttx nuttx.srec DEPENDS nuttx-srec
|
||
|
COMMENT "Regenerate nuttx.srec")
|
||
|
endif()
|
||
|
if(CONFIG_RAW_BINARY)
|
||
|
add_custom_command(
|
||
|
TARGET final_nuttx
|
||
|
POST_BUILD
|
||
|
COMMAND ${CMAKE_OBJCOPY} -O binary final_nuttx nuttx.bin DEPENDS nuttx-bin
|
||
|
COMMENT "Regenerate nuttx.bin")
|
||
|
endif()
|