lvgl-hmi-display-ui/CMakeLists.txt

210 lines
7.4 KiB
CMake

cmake_minimum_required(VERSION 3.12.4)
project(lvgl C CXX)
# Set the correct FreeRTOS port for your system (e.g., Posix for WSL)
set(FREERTOS_PORT GCC_POSIX CACHE STRING "Port for FreeRTOS on Posix environment")
unset(USE_FREERTOS CACHE)
option(USE_FREERTOS "Enable FreeRTOS" OFF) # Turn this on to enable FreeRTOS
if(USE_FREERTOS)
message(STATUS "FreeRTOS is enabled")
# FreeRTOS integration when USE_FREERTOS is enabled
add_library(freertos_config INTERFACE)
target_include_directories(freertos_config SYSTEM INTERFACE ${PROJECT_SOURCE_DIR}/config)
target_compile_definitions(freertos_config INTERFACE projCOVERAGE_TEST=0)
# Add FreeRTOS as a subdirectory
add_subdirectory(FreeRTOS)
# FreeRTOS-specific include directories
include_directories(${PROJECT_SOURCE_DIR}/FreeRTOS/include)
include_directories(${PROJECT_SOURCE_DIR}/FreeRTOS/portable/ThirdParty/GCC/Posix)
include_directories(${PROJECT_SOURCE_DIR}/config)
# Add FreeRTOS sources
file(GLOB FREERTOS_SOURCES
"${PROJECT_SOURCE_DIR}/FreeRTOS/*.c"
"${PROJECT_SOURCE_DIR}/FreeRTOS/portable/MemMang/heap_4.c"
"${PROJECT_SOURCE_DIR}/FreeRTOS/portable/ThirdParty/GCC/Posix/*.c"
)
else()
message(STATUS "FreeRTOS is disabled")
set(FREERTOS_SOURCES "") # No FreeRTOS sources if FreeRTOS is disabled
endif()
# Main include files of the project
include_directories(${PROJECT_SOURCE_DIR}/main/inc)
# Define options for LVGL with default values (OFF)
option(LV_USE_DRAW_SDL "Use SDL draw unit" OFF)
option(LV_USE_LIBPNG "Use libpng to decode PNG" OFF)
option(LV_USE_LIBJPEG_TURBO "Use libjpeg turbo to decode JPEG" OFF)
option(LV_USE_FFMPEG "Use libffmpeg to display video using lv_ffmpeg" OFF)
option(LV_USE_FREETYPE "Use freetype library" OFF)
# Set C and C++ standards
set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Set the output path for the executable
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
# Find and include SDL2 library
find_package(SDL2 REQUIRED)
# Add compile definitions based on the selected options
add_compile_definitions($<$<BOOL:${LV_USE_DRAW_SDL}>:LV_USE_DRAW_SDL=1>)
add_compile_definitions($<$<BOOL:${LV_USE_LIBPNG}>:LV_USE_LIBPNG=1>)
add_compile_definitions($<$<BOOL:${LV_USE_LIBJPEG_TURBO}>:LV_USE_LIBJPEG_TURBO=1>)
add_compile_definitions($<$<BOOL:${LV_USE_FFMPEG}>:LV_USE_FFMPEG=1>)
# Add LVGL subdirectory
add_subdirectory(lvgl)
target_include_directories(lvgl PUBLIC ${PROJECT_SOURCE_DIR} ${SDL2_INCLUDE_DIRS})
# Create the main executable, depending on the FreeRTOS option
if(USE_FREERTOS)
add_executable(main
${PROJECT_SOURCE_DIR}/main/src/main.c
${PROJECT_SOURCE_DIR}/main/src/freertos_main.cpp
${PROJECT_SOURCE_DIR}/main/src/mouse_cursor_icon.c
${PROJECT_SOURCE_DIR}/main/src/FreeRTOS_Posix_Port.c
${FREERTOS_SOURCES} # Add only if USE_FREERTOS is enabled
)
# Link FreeRTOS libraries
target_link_libraries(main freertos_config FreeRTOS)
else()
add_executable(main
${PROJECT_SOURCE_DIR}/main/src/main.c
${PROJECT_SOURCE_DIR}/main/src/mouse_cursor_icon.c
)
endif()
# Add sources for custom application
target_sources(main PRIVATE
${PROJECT_SOURCE_DIR}/rec-ui/main.c
${PROJECT_SOURCE_DIR}/rec-ui/utility_objects.c
${PROJECT_SOURCE_DIR}/rec-ui/utility_functions.c
${PROJECT_SOURCE_DIR}/rec-ui/montserrat_16_ru_en.c
${PROJECT_SOURCE_DIR}/rec-ui/montserrat_20_ru_en.c
${PROJECT_SOURCE_DIR}/rec-ui/montserrat_24_ru_en.c
${PROJECT_SOURCE_DIR}/rec-ui/montserrat_28_ru_en.c
${PROJECT_SOURCE_DIR}/rec-ui/montserrat_32_ru_en.c
${PROJECT_SOURCE_DIR}/rec-ui/montserrat_semibold_20_ru_en.c
${PROJECT_SOURCE_DIR}/rec-ui/montserrat_semibold_24_ru_en.c
${PROJECT_SOURCE_DIR}/rec-ui/montserrat_semibold_28_ru_en.c
${PROJECT_SOURCE_DIR}/rec-ui/montserrat_semibold_32_ru_en.c
${PROJECT_SOURCE_DIR}/rec-ui/arrow.c
${PROJECT_SOURCE_DIR}/rec-ui/moon_purple.c
${PROJECT_SOURCE_DIR}/rec-ui/sun_yellow.c
)
# Define LVGL configuration as a simple include
target_compile_definitions(main PRIVATE LV_CONF_INCLUDE_SIMPLE)
if(MSVC)
target_link_libraries(main lvgl lvgl::examples lvgl::demos lvgl::thorvg ${SDL2_LIBRARIES})
else()
target_link_libraries(main lvgl lvgl::examples lvgl::demos lvgl::thorvg ${SDL2_LIBRARIES} m pthread)
endif()
# Only link freertos_config if the FreeRTOS directory exists
if(USE_FREERTOS)
target_link_libraries(main freertos_config)
endif()
# Custom target to run the executable
add_custom_target(run COMMAND ${EXECUTABLE_OUTPUT_PATH}/main DEPENDS main)
# Conditionally include and link SDL2_image if LV_USE_DRAW_SDL is enabled
if(LV_USE_DRAW_SDL)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
find_package(SDL2_image REQUIRED)
target_include_directories(lvgl PUBLIC ${SDL2_IMAGE_INCLUDE_DIRS})
target_link_libraries(main ${SDL2_IMAGE_LIBRARIES})
endif()
# Conditionally include and link libpng if LV_USE_LIBPNG is enabled
if(LV_USE_LIBPNG)
find_package(PNG REQUIRED)
target_include_directories(lvgl PUBLIC ${PNG_INCLUDE_DIRS})
target_link_libraries(main ${PNG_LIBRARIES})
endif()
# Conditionally include and link libjpeg-turbo if LV_USE_LIBJPEG_TURBO is enabled
if(LV_USE_LIBJPEG_TURBO)
find_package(JPEG REQUIRED)
target_include_directories(lvgl PUBLIC ${JPEG_INCLUDE_DIRS})
target_link_libraries(main ${JPEG_LIBRARIES})
endif()
# Conditionally include and link FFmpeg libraries if LV_USE_FFMPEG is enabled
if(LV_USE_FFMPEG)
target_link_libraries(main avformat avcodec avutil swscale z)
endif()
# Conditionally include and link FreeType if LV_USE_FREETYPE is enabled
if(LV_USE_FREETYPE)
find_package(Freetype REQUIRED)
target_include_directories(lvgl PUBLIC ${FREETYPE_INCLUDE_DIRS})
target_link_libraries(main ${FREETYPE_LIBRARIES})
endif()
# On Windows, GUI applications do not show a console by default,
# which hides log output. This ensures a console is available for logging.
if (WIN32)
if (MSVC)
target_link_options(main PRIVATE "/SUBSYSTEM:CONSOLE")
else()
target_link_options(main PRIVATE "-mconsole")
endif()
endif()
# Apply additional compile options if the build type is Debug
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "Debug mode enabled")
target_compile_options(lvgl PRIVATE
-pedantic-errors
-Wall
-Wclobbered
-Wdeprecated
-Wdouble-promotion
-Wempty-body
-Wextra
-Wformat-security
-Wmaybe-uninitialized
# -Wmissing-prototypes
-Wpointer-arith
-Wmultichar
-Wno-pedantic # ignored for now, we convert functions to pointers for properties table.
-Wreturn-type
-Wshadow
-Wshift-negative-value
-Wsizeof-pointer-memaccess
-Wtype-limits
-Wundef
-Wuninitialized
-Wunreachable-code
-Wfloat-conversion
-Wstrict-aliasing
)
if (ASAN)
message(STATUS "AddressSanitizer enabled")
# Add AddressSanitizer flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")
else()
message(STATUS "AddressSanitizer disabled")
endif()
endif()