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}/src) # 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($<$:LV_USE_DRAW_SDL=1>) add_compile_definitions($<$:LV_USE_LIBPNG=1>) add_compile_definitions($<$:LV_USE_LIBJPEG_TURBO=1>) add_compile_definitions($<$: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}/src/main_sim.c ${PROJECT_SOURCE_DIR}/src/freertos_main.cpp ${PROJECT_SOURCE_DIR}/src/mouse_cursor_icon.c ${PROJECT_SOURCE_DIR}/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}/src/main_sim.c ${PROJECT_SOURCE_DIR}/src/mouse_cursor_icon.c ) endif() # Add sources for custom application target_sources(main PRIVATE ${PROJECT_SOURCE_DIR}/src/gui_generated.c ${PROJECT_SOURCE_DIR}/assets/montserrat_16_ru_en.c ${PROJECT_SOURCE_DIR}/assets/valve.c ${PROJECT_SOURCE_DIR}/assets/fan.c ${PROJECT_SOURCE_DIR}/assets/channel.c ${PROJECT_SOURCE_DIR}/assets/heater.c ${PROJECT_SOURCE_DIR}/assets/cooler.c ${PROJECT_SOURCE_DIR}/assets/pipe.c ${PROJECT_SOURCE_DIR}/assets/electric_heater.c ${PROJECT_SOURCE_DIR}/assets/filter_g4.c ${PROJECT_SOURCE_DIR}/assets/filter_h13.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()