Hide navigation sidebar
Hide table of contents sidebar
Back to top
Toggle table of contents sidebar

# Example CMakeLists.txt

CMake is powerful tool that provides the developer a great deal of flexibility in how their projects are built. As a result, `CMakeLists.txt` files can accomplish the same function in multiple ways.

Below is an example `CMakeLists.txt` that shows both required and conventional commands for a basic FreeRTOS project. This example can be used as a starting point for your application, but it is recommended to copy a `CMakeLists.txt` from an XMOS reference design or other example application that closely resembles your application.

    ## Specify your application sources by globbing the src folder
    file(GLOB_RECURSE APP_SOURCES src/*.c)

    ## Specify your application include paths
    set(APP_INCLUDES src)

    ## Specify your compiler flags
    set(APP_COMPILER_FLAGS
       -Os
       -report
       -fxscope
       -mcmodel=large
       ${CMAKE_CURRENT_SOURCE_DIR}/src/config.xscope
       ${CMAKE_CURRENT_SOURCE_DIR}/XCORE-AI-EXPLORER.xn
    )

    ## Specify any compile definitions
    set(APP_COMPILE_DEFINITIONS
       configENABLE_DEBUG_PRINTF=1
       PLATFORM_USES_TILE_0=1
       PLATFORM_USES_TILE_1=1
    )

    ## Set your link libraries
    set(APP_LINK_LIBRARIES
       rtos::bsp_config::xcore_ai_explorer
    )

    ## Set your link options
    set(APP_LINK_OPTIONS
       -report
       ${CMAKE_CURRENT_SOURCE_DIR}/XCORE-AI-EXPLORER.xn
       ${CMAKE_CURRENT_SOURCE_DIR}/src/config.xscope
    )

    ## Create your targets

    ## Create the target for the portion of application code that will execute on tile[0]
    set(TARGET_NAME tile0_my_app)
    add_executable(${TARGET_NAME} EXCLUDE_FROM_ALL)
    target_sources(${TARGET_NAME} PUBLIC ${APP_SOURCES})
    target_include_directories(${TARGET_NAME} PUBLIC ${APP_INCLUDES})
    target_compile_definitions(${TARGET_NAME} PUBLIC ${APP_COMPILE_DEFINITIONS} THIS_XCORE_TILE=0)
    target_compile_options(${TARGET_NAME} PRIVATE ${APP_COMPILER_FLAGS})
    target_link_libraries(${TARGET_NAME} PUBLIC ${APP_LINK_LIBRARIES})
    target_link_options(${TARGET_NAME} PRIVATE ${APP_LINK_OPTIONS})
    unset(TARGET_NAME)

    ## Create the target for the portion of application code that will execute on tile[1]
    set(TARGET_NAME tile1_my_app)
    add_executable(${TARGET_NAME} EXCLUDE_FROM_ALL)
    target_sources(${TARGET_NAME} PUBLIC ${APP_SOURCES})
    target_include_directories(${TARGET_NAME} PUBLIC ${APP_INCLUDES})
    target_compile_definitions(${TARGET_NAME} PUBLIC ${APP_COMPILE_DEFINITIONS} THIS_XCORE_TILE=1)
    target_compile_options(${TARGET_NAME} PRIVATE ${APP_COMPILER_FLAGS})
    target_link_libraries(${TARGET_NAME} PUBLIC ${APP_LINK_LIBRARIES})
    target_link_libraries(${TARGET_NAME} PRIVATE ${APP_LINK_OPTIONS} )
    unset(TARGET_NAME)

    ## Merge tile[0] and tile[1] binaries into a single binary using an XMOS CMake macro
    merge_binaries(my_app tile0_my_app tile1_my_app 1)

    ## Optionally create run and debug targets using XMOS CMake macros
    create_run_target(my_app)
    create_debug_target(my_app)

For more information, see the documentation for each of the CMake commands used in the example above.

- set

- add_executable

- target_sources

- target_include_directories

- target_compile_definitions

- target_compile_options

- target_link_libraries

- target_link_options

See Macros for more information on the XMOS CMake macros.