-
Notifications
You must be signed in to change notification settings - Fork 258
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
433 lines (322 loc) · 13.4 KB
/
Copy pathCMakeLists.txt
File metadata and controls
433 lines (322 loc) · 13.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
cmake_minimum_required(VERSION 3.11)
project(lvgl)
option(WERROR "Treat warnings as errors for LVGL targets" OFF)
option(ASAN "Enable Sanitizer Options" OFF)
# Set policy to allow to run the target_link_libraries cmd on targets that are build
# in another directory.
# Currently, the linking is not handled by env_support/cmake/os.cmake
# This means that if a driver is enabled and it requires linking an external library
# it needs to be handled in the top-level project.
cmake_policy(SET CMP0079 NEW)
# Uncomment if the program needs debugging
#set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_C_STANDARD 99) # LVGL officially supports C99 and above
set(CMAKE_CXX_STANDARD 17) #C17
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wpedantic")
find_package(Python3 REQUIRED COMPONENTS Interpreter)
if(ASAN)
message(STATUS "Enabling Sanitizer")
add_compile_options(-fsanitize=address,undefined,null)
add_link_options(-fsanitize=address,undefined,null,leak)
endif()
set(CONFIG "default" CACHE STRING "Config name to use. Leave empty for default `lv_conf.defaults`")
set(LV_CONF_DEFAULTS_PATH "${CMAKE_SOURCE_DIR}/lv_conf.defaults")
# If CONFIG is not default, update LV_CONF_DEFAULTS_PATH to the selected config
if(NOT CONFIG STREQUAL "default")
set(LV_CONF_DEFAULTS_PATH "${CMAKE_SOURCE_DIR}/configs/${CONFIG}.defaults")
endif()
if(NOT EXISTS "${LV_CONF_DEFAULTS_PATH}")
message(FATAL_ERROR "Config file not found: ${LV_CONF_DEFAULTS_PATH}")
endif()
message(STATUS "Using config: ${LV_CONF_DEFAULTS_PATH}")
set(LV_BUILD_SET_CONFIG_OPTS ON CACHE BOOL
"create CMAKE variables from lv_conf_internal.h" FORCE)
set(LV_BUILD_CONF_PATH
"${CMAKE_BINARY_DIR}/lv_conf.h"
CACHE PATH "path to lv_conf.h" FORCE)
set(LVGL_TEMPLATE_PATH "${CMAKE_SOURCE_DIR}/lvgl/lv_conf_template.h")
set(GENERATE_SCRIPT_PATH "${CMAKE_SOURCE_DIR}/lvgl/scripts/generate_lv_conf.py")
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${LVGL_TEMPLATE_PATH})
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${LV_CONF_DEFAULTS_PATH})
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${GENERATE_SCRIPT_PATH})
execute_process(
COMMAND
${Python3_EXECUTABLE} ${GENERATE_SCRIPT_PATH} --template
${LVGL_TEMPLATE_PATH} --defaults ${LV_CONF_DEFAULTS_PATH} --config
${LV_BUILD_CONF_PATH}
RESULT_VARIABLE config_result
OUTPUT_VARIABLE config_output
ERROR_VARIABLE config_output)
if(NOT config_result EQUAL 0)
message(FATAL_ERROR "Failed to generate lv_conf.h: ${config_output}")
endif()
message(STATUS "${LV_BUILD_CONF_PATH} generated successfully")
add_subdirectory(lvgl)
if (CONFIG_LV_USE_EVDEV)
message("Including EVDEV support")
find_package(PkgConfig REQUIRED)
pkg_check_modules(EVDEV REQUIRED libevdev)
list(APPEND PKG_CONFIG_LIB ${EVDEV_LIBRARIES})
list(APPEND PKG_CONFIG_INC ${EVDEV_INCLUDE_DIRS})
list(APPEND LV_LINUX_BACKEND_SRC src/lib/indev_backends/evdev.c)
endif()
if (CONFIG_LV_USE_LINUX_DRM)
message("Including DRM support")
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBDRM REQUIRED libdrm)
list(APPEND PKG_CONFIG_LIB ${LIBDRM_LIBRARIES})
list(APPEND PKG_CONFIG_INC ${LIBDRM_INCLUDE_DIRS})
list(APPEND LV_LINUX_BACKEND_SRC src/lib/display_backends/drm.c)
endif()
if (CONFIG_LV_USE_LINUX_DRM_GBM_BUFFERS OR CONFIG_LV_LINUX_DRM_USE_EGL)
message("Including GBM support")
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBGBM REQUIRED gbm)
list(APPEND PKG_CONFIG_LIB ${LIBGBM_LIBRARIES})
list(APPEND PKG_CONFIG_INC ${LIBGBM_INCLUDE_DIRS})
endif()
if (CONFIG_LV_USE_LIBINPUT)
message("Including libinput support")
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBINPUT REQUIRED libinput)
list(APPEND PKG_CONFIG_LIB ${LIBINPUT_LIBRARIES})
list(APPEND PKG_CONFIG_INC ${LIBINPUT_INCLUDE_DIRS})
endif()
if (CONFIG_LV_USE_FREETYPE)
message("Including Freetype support")
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBFREETYPE REQUIRED freetype2)
list(APPEND PKG_CONFIG_LIB ${LIBFREETYPE_LIBRARIES})
list(APPEND PKG_CONFIG_INC ${LIBFREETYPE_INCLUDE_DIRS})
endif()
if (CONFIG_LV_USE_SDL OR CONFIG_LV_USE_DRAW_SDL)
message("Including SDL2 support")
find_package(PkgConfig REQUIRED)
pkg_check_modules(SDL2 REQUIRED sdl2)
pkg_check_modules(SDL2_IMAGE REQUIRED SDL2_image)
list(APPEND PKG_CONFIG_LIB ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES})
list(APPEND PKG_CONFIG_INC ${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS})
list(APPEND LV_LINUX_BACKEND_SRC src/lib/display_backends/sdl.c)
endif()
if (CONFIG_LV_USE_WAYLAND)
message("Including Wayland support")
find_package(PkgConfig REQUIRED)
pkg_check_modules(WAYLAND_CLIENT REQUIRED wayland-client)
pkg_check_modules(WAYLAND_CURSOR REQUIRED wayland-cursor)
pkg_check_modules(XKBCOMMON REQUIRED xkbcommon)
list(APPEND PKG_CONFIG_LIB ${WAYLAND_CLIENT_LIBRARIES})
list(APPEND PKG_CONFIG_LIB ${WAYLAND_CURSOR_LIBRARIES})
list(APPEND PKG_CONFIG_LIB ${XKBCOMMON_LIBRARIES})
# Wayland protocols
pkg_check_modules(WAYLAND_PROTOCOLS REQUIRED wayland-protocols>=1.20)
pkg_get_variable(WAYLAND_PROTOCOLS_BASE wayland-protocols pkgdatadir)
if(DEFINED ENV{SDKTARGETSYSROOT} AND DEFINED ENV{SYSROOT})
message(FATAL_ERROR "Both SDKTARGETSYSROOT and SYSROOT are set. Please set only one.")
endif()
if(DEFINED ENV{SDKTARGETSYSROOT})
set(PROTOCOL_ROOT "$ENV{SDKTARGETSYSROOT}/usr/share/wayland-protocols")
elseif(DEFINED ENV{SYSROOT})
set(PROTOCOL_ROOT "$ENV{SYSROOT}/usr/share/wayland-protocols")
else()
set(PROTOCOL_ROOT "/usr/share/wayland-protocols")
endif()
if(NOT EXISTS ${PROTOCOL_ROOT})
message(FATAL_ERROR "Wayland protocols not found at ${PROTOCOL_ROOT}")
endif()
set(PROTOCOLS_DIR "${CMAKE_CURRENT_BINARY_DIR}/protocols")
file(MAKE_DIRECTORY ${PROTOCOLS_DIR})
set(WAYLAND_PROTOCOLS_SRC "")
# Use public-code for shared libs, private-code for static libs
if(BUILD_SHARED_LIBS)
set(WAYLAND_SCANNER_CODE_MODE "public-code")
else()
set(WAYLAND_SCANNER_CODE_MODE "private-code")
endif()
# Generate xdg-shell protocol (always)
set(XDG_SHELL_XML "${PROTOCOL_ROOT}/stable/xdg-shell/xdg-shell.xml")
set(XDG_SHELL_HEADER "${PROTOCOLS_DIR}/wayland_xdg_shell.h")
set(XDG_SHELL_SOURCE "${PROTOCOLS_DIR}/wayland_xdg_shell.c")
if(NOT EXISTS ${XDG_SHELL_HEADER} OR NOT EXISTS ${XDG_SHELL_SOURCE})
execute_process(COMMAND wayland-scanner client-header ${XDG_SHELL_XML} ${XDG_SHELL_HEADER})
execute_process(COMMAND wayland-scanner ${WAYLAND_SCANNER_CODE_MODE} ${XDG_SHELL_XML} ${XDG_SHELL_SOURCE})
endif()
list(APPEND WAYLAND_PROTOCOLS_SRC ${XDG_SHELL_SOURCE})
# Generate dmabuf protocol (if config is set)
if(CONFIG_LV_WAYLAND_USE_G2D)
set(DMABUF_XML "${PROTOCOL_ROOT}/stable/linux-dmabuf/linux-dmabuf-v1.xml")
set(DMABUF_HEADER "${PROTOCOLS_DIR}/wayland_linux_dmabuf.h")
set(DMABUF_SOURCE "${PROTOCOLS_DIR}/wayland_linux_dmabuf.c")
if(NOT EXISTS ${DMABUF_HEADER} OR NOT EXISTS ${DMABUF_SOURCE})
execute_process(COMMAND wayland-scanner client-header ${DMABUF_XML} ${DMABUF_HEADER})
execute_process(COMMAND wayland-scanner ${WAYLAND_SCANNER_CODE_MODE} ${DMABUF_XML} ${DMABUF_SOURCE})
endif()
list(APPEND WAYLAND_PROTOCOLS_SRC ${DMABUF_SOURCE})
endif()
if(CONFIG_LV_WAYLAND_USE_EGL)
message("Including WAYLAND EGL support")
pkg_check_modules(WAYLAND_EGL REQUIRED wayland-egl)
list(APPEND PKG_CONFIG_LIB ${WAYLAND_EGL_LIBRARIES})
list(APPEND PKG_CONFIG_INC ${WAYLAND_EGL_INCLUDE_DIRS})
endif()
list(APPEND PKG_CONFIG_INC ${PROTOCOLS_DIR})
list(APPEND LV_LINUX_BACKEND_SRC src/lib/display_backends/wayland.c ${WAYLAND_PROTOCOLS_SRC})
endif()
if (CONFIG_LV_USE_X11)
find_package(PkgConfig REQUIRED)
pkg_check_modules(X11 REQUIRED x11)
message("Including X11 support")
list(APPEND PKG_CONFIG_INC ${X11_INCLUDE_DIRS})
list(APPEND PKG_CONFIG_LIB ${X11_LIBRARIES})
list(APPEND LV_LINUX_BACKEND_SRC src/lib/display_backends/x11.c)
endif()
if (CONFIG_LV_USE_LINUX_FBDEV)
# FBDEV has no dependencies
message("Including FBDEV support")
list(APPEND LV_LINUX_BACKEND_SRC src/lib/display_backends/fbdev.c)
endif()
if (CONFIG_LV_USE_GLFW)
message("Including GLFW support")
find_package(PkgConfig REQUIRED)
pkg_check_modules(GLFW3 REQUIRED glfw3)
pkg_check_modules(GLEW REQUIRED glew)
list(APPEND PKG_CONFIG_LIB ${GLFW3_LIBRARIES})
list(APPEND PKG_CONFIG_LIB ${GLEW_LIBRARIES})
list(APPEND LV_LINUX_BACKEND_SRC src/lib/display_backends/glfw3.c)
endif()
if (CONFIG_LV_USE_DRAW_G2D)
message("Including G2D support")
find_library(G2D_LIBRARY NAMES g2d)
list(APPEND PKG_CONFIG_LIB ${G2D_LIBRARY})
endif()
if (CONFIG_LV_USE_GLTF)
message(STATUS "Including with GLTF support")
include(FetchContent)
FetchContent_Declare(
fastgltf
GIT_REPOSITORY https://github.com/spnda/fastgltf
GIT_TAG f04052ebd8d157c7b6e8fc3dd9f1ed83df99f3e5)
set(FASTGLTF_ENABLE_DEPRECATED_EXT
ON
CACHE BOOL "" FORCE)
set(FASTGLTF_DIFFUSE_TRANSMISSION_SUPPORT
ON
CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(fastgltf)
set(WEBP_BUILD_ANIM_UTILS
OFF
CACHE BOOL "" FORCE)
set(WEBP_BUILD_CWEBP
OFF
CACHE BOOL "" FORCE)
set(WEBP_BUILD_DWEBP
OFF
CACHE BOOL "" FORCE)
set(WEBP_BUILD_GIF2WEBP
OFF
CACHE BOOL "" FORCE)
set(WEBP_BUILD_IMG2WEBP
OFF
CACHE BOOL "" FORCE)
set(WEBP_BUILD_VWEBP
OFF
CACHE BOOL "" FORCE)
set(WEBP_BUILD_WEBPINFO
OFF
CACHE BOOL "" FORCE)
set(WEBP_BUILD_WEBPMUX
OFF
CACHE BOOL "" FORCE)
set(WEBP_BUILD_EXTRAS
OFF
CACHE BOOL "" FORCE)
FetchContent_Declare(
webp
GIT_REPOSITORY https://github.com/webmproject/libwebp
GIT_TAG fa6f56496a442eed59b103250021e4b14ebf1427)
FetchContent_MakeAvailable(webp)
list(APPEND PKG_CONFIG_LIB fastgltf webp)
endif()
if (CONFIG_LV_USE_GSTREAMER)
message("Including GSTREAMER support")
find_package(PkgConfig REQUIRED)
pkg_check_modules(GSTREAMER REQUIRED gstreamer-1.0)
pkg_check_modules(GSTREAMER_VIDEO REQUIRED gstreamer-video-1.0)
pkg_check_modules(GSTREAMER_APP REQUIRED gstreamer-app-1.0)
list(APPEND PKG_CONFIG_LIB ${GSTREAMER_VIDEO_LIBRARIES} ${GSTREAMER_APP_LIBRARIES})
list(APPEND PKG_CONFIG_INC ${GSTREAMER_VIDEO_INCLUDE_DIRS} ${GSTREAMER_APP_INCLUDE_DIRS})
endif()
if (CONFIG_LV_USE_FFMPEG)
message("Including FFMPEG support")
find_package(PkgConfig REQUIRED)
pkg_check_modules(AVFORMAT REQUIRED libavformat)
pkg_check_modules(AVCODEC REQUIRED libavcodec)
pkg_check_modules(AVUTIL REQUIRED libavutil)
pkg_check_modules(SWSCALE REQUIRED libswscale)
list(APPEND PKG_CONFIG_LIB
${AVFORMAT_LIBRARIES}
${AVCODEC_LIBRARIES}
${AVUTIL_LIBRARIES}
${SWSCALE_LIBRARIES}
)
list(APPEND PKG_CONFIG_INC
${AVFORMAT_INCLUDE_DIRS}
${AVCODEC_INCLUDE_DIRS}
${AVUTIL_INCLUDE_DIRS}
${SWSCALE_INCLUDE_DIRS}
)
endif()
# Check for external demos
if(CONFIG_LV_USE_DEMO_FLEX_LAYOUT
OR CONFIG_LV_USE_DEMO_MULTILANG
OR CONFIG_LV_USE_DEMO_TRANSFORM
OR CONFIG_LV_USE_DEMO_SCROLL
OR CONFIG_LV_USE_DEMO_EBIKE
OR CONFIG_LV_USE_DEMO_HIGH_RES
OR CONFIG_LV_USE_DEMO_SMARTWATCH)
set(USE_EXTERNAL_DEMOS ON)
else()
set(USE_EXTERNAL_DEMOS OFF)
endif()
if(USE_EXTERNAL_DEMOS)
message("Including external demos")
include(FetchContent)
FetchContent_Declare(lv_demos_ext GIT_REPOSITORY https://github.com/lvgl/lv_demos)
FetchContent_MakeAvailable(lv_demos_ext)
list(APPEND PKG_CONFIG_LIB lv_demos_ext)
endif()
file(GLOB LV_LINUX_SRC src/lib/*.c)
set(LV_LINUX_INC src/lib)
target_include_directories(lvgl PUBLIC ${PKG_CONFIG_INC})
# Library type is determined by BUILD_SHARED_LIBS (shared if ON, static if OFF)
add_library(lvgl_linux ${LV_LINUX_SRC} ${LV_LINUX_BACKEND_SRC})
target_include_directories(lvgl_linux PUBLIC ${PKG_CONFIG_INC})
# If LVGL is configured to use LV_CONF_PATH or Kconfig
# Set the exactly the same definitions on the lvgl_linux target
set_target_properties(lvgl_linux PROPERTIES COMPILE_DEFINITIONS "${LVGL_COMPILER_DEFINES}")
target_include_directories(lvgl_linux PUBLIC
${LV_LINUX_INC} ${CMAKE_CURRENT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/src/lib ${LVGL_CONF_INC_DIR})
# Link LVGL with external dependencies - Modern CMake/CMP0079 allows this
target_link_libraries(lvgl PUBLIC ${PKG_CONFIG_LIB} m pthread rt dl)
add_executable(lvglsim src/main.c)
# Repeat lvgl_linux to resolve circular dependency with lvgl
target_link_libraries(lvglsim lvgl_linux lvgl lvgl_linux)
if(WERROR)
target_compile_options(lvglsim PRIVATE -Werror)
target_compile_options(lvgl PRIVATE -Werror)
target_compile_options(lvgl_linux PRIVATE -Werror)
endif()
# Install the lvgl_linux library and its headers
install(DIRECTORY src/lib/
DESTINATION include/lvgl
FILES_MATCHING
PATTERN "backends*" EXCLUDE
PATTERN "*.h")
install(TARGETS lvgl_linux
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
add_custom_target(run COMMAND ${EXECUTABLE_OUTPUT_PATH}/lvglsim DEPENDS lvglsim)