nuttx/cmake/nuttx_generate_headers.cmake

159 lines
6.5 KiB
CMake
Raw Normal View History

# ##############################################################################
# cmake/nuttx_generate_headers.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.
#
# ##############################################################################
# setup target to generate config.h and version.h from mkconfig and mkversion
if(NOT EXISTS ${CMAKE_BINARY_DIR}/include)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/include)
endif()
if(NOT EXISTS ${CMAKE_BINARY_DIR}/include/nuttx)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/include/nuttx)
endif()
include(nuttx_mkconfig)
include(nuttx_mkversion)
# Setup symbolic link generation
if(NOT EXISTS ${CMAKE_BINARY_DIR}/include_apps)
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory
${CMAKE_BINARY_DIR}/include_apps)
endif()
if(NOT EXISTS ${CMAKE_BINARY_DIR}/include/arch)
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory
${CMAKE_BINARY_DIR}/include/arch)
file(GLOB CONTENTS ${NUTTX_DIR}/arch/${CONFIG_ARCH}/include/*)
foreach(ARCH_INCDIR ${CONTENTS})
get_filename_component(SUB_ELEMENT ${ARCH_INCDIR} NAME)
nuttx_create_symlink(${NUTTX_DIR}/arch/${CONFIG_ARCH}/include/${SUB_ELEMENT}
${CMAKE_BINARY_DIR}/include/arch/${SUB_ELEMENT})
endforeach()
endif()
if(NOT EXISTS ${CMAKE_BINARY_DIR}/include/arch/board)
if(EXISTS ${NUTTX_BOARD_DIR}/include)
nuttx_create_symlink(${NUTTX_BOARD_DIR}/include
${CMAKE_BINARY_DIR}/include/arch/board)
elseif(EXISTS ${NUTTX_BOARD_DIR}/../common/include)
nuttx_create_symlink(${NUTTX_BOARD_DIR}/../common/include
${CMAKE_BINARY_DIR}/include/arch/board)
endif()
endif()
if(NOT EXISTS ${CMAKE_BINARY_DIR}/include/arch/chip)
if(CONFIG_ARCH_CHIP_CUSTOM)
nuttx_create_symlink(${NUTTX_CHIP_ABS_DIR}/include
${CMAKE_BINARY_DIR}/include/arch/chip)
else()
nuttx_create_symlink(
${NUTTX_DIR}/arch/${CONFIG_ARCH}/include/${CONFIG_ARCH_CHIP}
${CMAKE_BINARY_DIR}/include/arch/chip)
endif()
endif()
# Optional symbolic links
# Target used to copy include/nuttx/lib/stdarg.h. If CONFIG_ARCH_STDARG_H is
# defined, then there is an architecture specific stdarg.h header file that will
# be included indirectly from include/lib/stdarg.h. But first, we have to copy
# stdarg.h from include/nuttx/. to include/.
if(CONFIG_ARCH_STDARG_H)
nuttx_create_symlink(${NUTTX_DIR}/include/nuttx/lib/stdarg.h
${CMAKE_BINARY_DIR}/include/stdarg.h)
else()
file(REMOVE ${CMAKE_BINARY_DIR}/include/stdarg.h)
endif()
# Target used to copy include/nuttx/lib/math.h. If CONFIG_ARCH_MATH_H is
# defined, then there is an architecture specific math.h header file that will
# be included indirectly from include/math.h. But first, we have to copy math.h
# from include/nuttx/. to include/. Logic within include/nuttx/lib/math.h will
# hand the redirection to the architecture- specific math.h header file.
#
# If the CONFIG_LIBM is defined, the Rhombus libm will be built at libc/math.
# Definitions and prototypes for the Rhombus libm are also contained in
# include/nuttx/lib/math.h and so the file must also be copied in that case.
#
# If neither CONFIG_ARCH_MATH_H nor CONFIG_LIBM is defined, then no math.h
# header file will be provided. You would want that behavior if (1) you don't
# use libm, or (2) you want to use the math.h and libm provided within your
# toolchain.
if(CONFIG_ARCH_MATH_H OR CONFIG_LIBM)
set(NEED_MATH_H true)
endif()
if(NEED_MATH_H)
nuttx_create_symlink(${NUTTX_DIR}/include/nuttx/lib/math.h
${CMAKE_BINARY_DIR}/include/math.h)
else()
file(REMOVE ${CMAKE_BINARY_DIR}/include/math.h)
endif()
# The float.h header file defines the properties of your floating point
# implementation. It would always be best to use your toolchain's float.h
# header file but if none is available, a default float.h header file will
# provided if this option is selected. However there is no assurance that the
# settings in this float.h are actually correct for your platform!
if(CONFIG_ARCH_FLOAT_H)
nuttx_create_symlink(${NUTTX_DIR}/include/nuttx/lib/float.h
${CMAKE_BINARY_DIR}/include/float.h)
else()
file(REMOVE ${CMAKE_BINARY_DIR}/include/float.h)
endif()
# Target used to copy include/nuttx/lib/setjmp.h. If CONFIG_ARCH_SETJMP_H is
# defined, then there is an architecture specific setjmp.h header file that will
# be included indirectly from include/lib/setjmp.h. But first, we have to copy
# setjmp.h from include/nuttx/. to include/.
if(CONFIG_ARCH_SETJMP_H)
nuttx_create_symlink(${NUTTX_DIR}/include/nuttx/lib/setjmp.h
${CMAKE_BINARY_DIR}/include/setjmp.h)
else()
file(REMOVE ${CMAKE_BINARY_DIR}/include/setjmp.h)
endif()
# Add final context target that ties together all of the above The context
# target is invoked on each target build to assure that NuttX is properly
# configured. The basic configuration steps include creation of the the
# config.h and version.h header files in the include/nuttx directory and the
# establishment of symbolic links to configured directories.
add_custom_target(
nuttx_context
DEPENDS
${CMAKE_BINARY_DIR}/include/nuttx/config.h
${CMAKE_BINARY_DIR}/include/nuttx/version.h
$<$<BOOL:${CONFIG_ARCH_STDARG_H}>:${CMAKE_BINARY_DIR}/include/stdarg.h>
$<$<BOOL:${NEED_MATH_H}>:${CMAKE_BINARY_DIR}/include/math.h>
$<$<BOOL:${CONFIG_ARCH_FLOAT_H}>:${CMAKE_BINARY_DIR}/include/float.h>
$<$<BOOL:${CONFIG_ARCH_SETJMP_H}>:${CMAKE_BINARY_DIR}/include/setjmp.h>)
# apps_context is a PHONY target used as an intermediate process to control the
# time order of context preparation actions of app building
add_custom_target(apps_context ALL DEPENDS nuttx_context)