sof/CMakeLists.txt

113 lines
3.2 KiB
CMake
Raw Normal View History

cmake_minimum_required(VERSION 3.10)
if(NOT (${CMAKE_VERSION} VERSION_LESS "3.13.0"))
# CMake 3.13+ has less restrictive rules for target_link_libraries()
# Until we make 3.13 as required minimum version we want to
# use old behaviour for compatibility
cmake_policy(SET CMP0079 OLD)
endif()
# firmware build supports only xtensa arch for now
set(ARCH xtensa)
# let user override built-in toolchains
if(DEFINED CMAKE_TOOLCHAIN_FILE)
set(TOOLCHAIN "${CMAKE_TOOLCHAIN_FILE}")
else()
include(scripts/cmake/${ARCH}-toolchain.cmake OPTIONAL)
endif()
include(scripts/cmake/misc.cmake)
project(SOF C ASM)
set(PYTHON3 python3)
# get compiler name and version
execute_process(
COMMAND ${CMAKE_C_COMPILER} --version
COMMAND head -n 1
OUTPUT_VARIABLE CC_VERSION_TEXT
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
set(GENERATED_DIRECTORY ${PROJECT_BINARY_DIR}/generated)
file(MAKE_DIRECTORY ${GENERATED_DIRECTORY}/include)
set(DOT_CONFIG_PATH ${GENERATED_DIRECTORY}/.config)
set(CONFIG_H_PATH ${GENERATED_DIRECTORY}/include/config.h)
set(VERSION_H_PATH ${GENERATED_DIRECTORY}/include/version.h)
include(scripts/cmake/version.cmake)
sof_add_version_h_rule(${PROJECT_SOURCE_DIR}/scripts/cmake/version.cmake)
# cmake itself cannot depend on files that don't exist
# so to make it regenerate when .config file is created,
# we make it depend on containing directory
# NOTE: some filesystems may be unable to watch directory change,
# in that case cmake may need to be regenerated from CLI
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
${GENERATED_DIRECTORY} ${DOT_CONFIG_PATH})
if(EXISTS ${DOT_CONFIG_PATH})
read_kconfig_config(${DOT_CONFIG_PATH})
endif()
add_custom_target(
menuconfig
COMMAND ${CMAKE_COMMAND} -E env
srctree=${PROJECT_SOURCE_DIR}
CC_VERSION_TEXT=${CC_VERSION_TEXT}
ARCH=${ARCH}
${PYTHON3} ${PROJECT_SOURCE_DIR}/scripts/kconfig/menuconfig.py
${PROJECT_SOURCE_DIR}/Kconfig
WORKING_DIRECTORY ${GENERATED_DIRECTORY}
VERBATIM
USES_TERMINAL
)
add_custom_command(OUTPUT ${CONFIG_H_PATH}
COMMAND ${CMAKE_COMMAND} -E env
srctree=${PROJECT_SOURCE_DIR}
CC_VERSION_TEXT=${CC_VERSION_TEXT}
ARCH=${ARCH}
${PYTHON3} ${PROJECT_SOURCE_DIR}/scripts/kconfig/genconfig.py
--header-path ${CONFIG_H_PATH}
${PROJECT_SOURCE_DIR}/Kconfig
DEPENDS ${DOT_CONFIG_PATH}
WORKING_DIRECTORY ${GENERATED_DIRECTORY}
COMMENT "Generating ${CONFIG_H_PATH}"
VERBATIM
USES_TERMINAL
)
add_custom_target(genconfig DEPENDS ${CONFIG_H_PATH})
# most of other options are set on per-arch basis
set(CMAKE_ASM_FLAGS -DASSEMBLY)
# interface library that is used only as container for sof binary options
# other targets can use it to build with the same options
add_library(sof_options INTERFACE)
add_dependencies(sof_options genconfig)
add_library(sof_ld_flags INTERFACE)
add_library(sof_ld_scripts INTERFACE)
# declare target with no sources to let cmake know about it
add_executable(sof "")
target_link_libraries(sof sof_options)
target_link_libraries(sof sof_ld_scripts)
target_link_libraries(sof sof_ld_flags)
add_dependencies(sof_options genconfig)
target_include_directories(sof_options INTERFACE ${PROJECT_SOURCE_DIR}/src/include)
target_include_directories(sof_options INTERFACE ${GENERATED_DIRECTORY}/include)
add_subdirectory(src)
target_link_libraries(sof sof_lib)