Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 148 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
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()

# TODO: take `host` out of fw build
option(BUILD_HOST "Build host program" OFF)
option(BUILD_UNIT_TESTS "Build unit tests" OFF)

if(BUILD_HOST)
set(ARCH host)
else()
# firmware build supports only xtensa arch for now
set(ARCH xtensa)
endif()

# 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)

# most of other options are set on per-arch and per-target 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)

target_include_directories(sof_options INTERFACE ${PROJECT_SOURCE_DIR}/src/include)

if(BUILD_HOST)
add_subdirectory(src)
# rest of this file is not needed for host build
return()
endif()

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)

include(scripts/cmake/defconfigs.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_target(
overrideconfig
COMMAND ${CMAKE_COMMAND} -E env
srctree=${PROJECT_SOURCE_DIR}
CC_VERSION_TEXT=${CC_VERSION_TEXT}
ARCH=${ARCH}
${PYTHON3} ${PROJECT_SOURCE_DIR}/scripts/kconfig/overrideconfig.py
${PROJECT_SOURCE_DIR}/Kconfig
${PROJECT_BINARY_DIR}/override.config
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})

add_dependencies(sof_options genconfig)
target_include_directories(sof_options INTERFACE ${GENERATED_DIRECTORY}/include)

if(BUILD_UNIT_TESTS)
enable_testing()
add_subdirectory(src/arch/${ARCH})
add_subdirectory(test)
# rest of this file is not needed for unit tests
return()
endif()

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_subdirectory(src)

target_link_libraries(sof sof_lib)
57 changes: 57 additions & 0 deletions Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
mainmenu "SOF $(PROJECTVERSION) Configuration"

comment "Compiler: $(CC_VERSION_TEXT)"

config HOST_PTABLE
bool
default n

config TASK_HAVE_PRIORITY_MEDIUM
bool
default n

config BOOT_LOADER
bool
default n

config IRQ_MAP
bool
default n

config DMA_GW
bool
default n

config MEM_WND
bool
default n

source "src/Kconfig"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So I think the 6 above options are not user configurable but should be enabled/disabled by the platform selection (that same way Linux does this). e.g.

config MEM_WND
        bool

and the any platforms that use memory windows would select it

config PLATFORM_APL
         bool "build APL blah"
         select CONFIG_MEM_WND
         etc....

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will make it like you wrote. It looks like these selects in Linux are used mostly for HAVE_* configs, because they declare capabilites of arch/platform, however I think in the future we should make Kconfig files less platform-oriented.

Problem is in how you define user. What you wrote is good for someone that want to run feature-customized version of FW on already defined platform, but for adding new platform with different HW capabilites it may become unmanagable.

Maybe we should aim for definitions based on multiple configs where you have base+diffs (something more like zephyr than linux).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jajanusz Might be easier to have a complete derived config for a platform/board, easier to read complete recipe. Base rather does not change, so no issue with multiple edits.

Another note: how about storing platform/board defs in /platforms, or /boards, not that deep under arch (what about heterogeneous plaforms)?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mmaka1 is right that storing it in arch may not be the best idea (even if it's how it's done in kernel)

@mmaka1 @lgirdwood We can always easily change things like these when PR is merged. Kconfig/Cmake are just tools, we can use them however we want for our project.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fwiw, Linux does store it's def_configs under arch//configs/ but I don't think we need to do this atm (as Linux easily has hundreds).
@jajanusz yeah, I'm keen to merge and sort out any integration issues after merging, that way all the others can try/test and provide feedback.
@mmaka1 do you approve ? if so I will merge.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jajanusz if you are also happy for merging now pls change the PR title to remove the DO NOT MERGE. Thanks.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@lgirdwood
Still waiting for person responsible for CI to update Internal CI.
I'll let you know when it's done.

menu "Debug"

config GDB_DEBUG
bool "GDB Stub"
default n
help
Select for GDB debugging

config DEBUG_HEAP
bool "Heap debug"
default n
help
Select for enable heap alloc debugging

config DEBUG
bool "Debug build"
default n
help
Select for debug build

config BUILD_VM_ROM
bool "Build VM ROM"
default n
help
Select if you want to build VM ROM

endmenu
71 changes: 0 additions & 71 deletions Makefile.am

This file was deleted.

13 changes: 0 additions & 13 deletions autogen.sh

This file was deleted.

Loading