代码仓库:
https://github.com/czhzasui/skui-imx
环境准备
使用的skui git分支:
commit 201707d06bd29c9ec4b05350b25b777493d5362e (origin/master, origin/HEAD)
Author: Ruben Van Boxem <vanboxem.ruben@gmail.com>
Date: Tue Sep 1 17:43:19 2020 +0200
编译平台:Ubuntu18
目标平台:NXP IMX8Q Android9
开始移植
一、修改CMakeLists.txt
skui/CMakeLists.txt添加宏SKUI_USE_IMX8,控制编译平台
option(SKUI_USE_IMX8 "Use imx8 platform package" OFF)
修改cmake/3rdparty_options.cmake,屏蔽skui自带的库
if (NOT SKUI_USE_IMX8)
add_subdirectory(3rdparty)
endif ()
修改cmake/toolchain_options.cmake,设置交叉编译环境
if (SKUI_USE_IMX8)
set(CMAKE_C_COMPILER /work/android-toolchain/arm64/bin/clang)
set(CMAKE_CXX_COMPILER /work/android-toolchain/arm64/bin/clang++)
message("CMAKE_C_COMPILER:" ${CMAKE_C_COMPILER})
message("CMAKE_CXX_COMPILER:" ${CMAKE_CXX_COMPILER})
include_directories(common/include)
include_directories(common/include/skia)
include_directories(common/include/skia/include)
include_directories(common/include/skia/include/config)
include_directories(common/include/skia/include/core)
include_directories(common/include/skia/include/codec)
include_directories(common/include/skia/include/gpu)
include_directories(common/include/skia/include/gpu/vk)
include_directories(common/include/skia/include/android)
include_directories(common/include/skia/include/config/android)
include_directories(common/include/skia/include/private)
include_directories(common/include/skia/include/utils)
include_directories(common/include/skia/include/effects)
include_directories(common/include/skia/include/third_party/vulkan)
include_directories(common/include/skia/include/gpu/gl)
else()
include(toolchain_options)
endif ()
修改core/CMakeLists.txt
删掉stdc++fs,IMX8平台没有该库
if (NOT SKUI_USE_IMX8)
target_link_libraries(core PUBLIC $<$<PLATFORM_ID:Linux>:-pthread>
$<$<CXX_COMPILER_ID:GNU>:-lstdc++fs>
$<$<AND:$<PLATFORM_ID:Windows>,$<AND:$<CXX_COMPILER_ID:Clang>,$<NOT:$<STREQUAL:"x${CMAKE_CXX_SIMULATE_ID}","xMSVC">>>>:-lstdc++fs>
$<$<AND:$<NOT:$<PLATFORM_ID:Windows>>,$<AND:$<CXX_COMPILER_ID:Clang>,$<AND:$<VERSION_GREATER_EQUAL:$<CXX_COMPILER_VERSION>,7>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,9>>>>:-lc++fs>
$<$<AND:$<NOT:$<PLATFORM_ID:Windows>>,$<AND:$<CXX_COMPILER_ID:Clang>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,7>>>:-lc++experimental>
$<$<NOT:$<PLATFORM_ID:Windows>>:-ldl>)
else ()
target_link_libraries(core PUBLIC $<$<PLATFORM_ID:Linux>:-pthread>
$<$<AND:$<PLATFORM_ID:Windows>,$<AND:$<CXX_COMPILER_ID:Clang>,$<NOT:$<STREQUAL:"x${CMAKE_CXX_SIMULATE_ID}","xMSVC">>>>:-lstdc++fs>
$<$<AND:$<NOT:$<PLATFORM_ID:Windows>>,$<AND:$<CXX_COMPILER_ID:Clang>,$<AND:$<VERSION_GREATER_EQUAL:$<CXX_COMPILER_VERSION>,7>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,9>>>>:-lc++fs>
$<$<AND:$<NOT:$<PLATFORM_ID:Windows>>,$<AND:$<CXX_COMPILER_ID:Clang>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,7>>>:-lc++experimental>
$<$<NOT:$<PLATFORM_ID:Windows>>:-ldl>)
endif ()
修改graphics/CMakeLists.txt,使用imx平台的库skia、opengl库
if (NOT SKUI_USE_IMX8)
target_link_libraries(graphics PRIVATE skia opengl)
else()
target_link_libraries(graphics PRIVATE -lskia_m75 -lGLESv2_VIVANTE)
target_compile_definitions(graphics PRIVATE SKUI_GRAPHICS_INSIDES
SKUI_USE_IMX8)
endif()
修改gui/CMakeLists.txt,添加Android Surface和EGL库
if (NOT SKUI_USE_IMX8)
target_link_libraries(gui PUBLIC core graphics)
else()
target_link_libraries(gui PUBLIC core graphics -lasurface -lEGL)
endif()
添加imx平台窗口初始化的代码
# Common source files
set(gui_src
icon.h++
input.h++
layout.h++ layout.c++
main_windows.c++
make_element.h++
window.h++ window.c++
window_imx.c++
window_linux.c++
window_macosx.c++
window_windows.c++
window_flags.h++
window_state.h++
)
set(element_src
element.h++ element.c++
element/graphics_view.h++ element/graphics_view.c++
element/label.h++ element/label.c++
element/spacer.h++ element/spacer.c++
)
set(events_src
events.h++ events.c++ events_linux.c++
events_imx.c++
events_macosx.c++
events_windows.c++
events/appkit.h++ events/appkit.c++
events/uikit.h++ events/uikit.c++
events/win32.h++ events/win32.c++
events/xcb.h++ events/xcb.c++
events/imx.h++ events/imx.c++
)
set(input_src
input.h++
input/key.h++
input/button.h++ input/button.c++
input/scroll.h++ input/scroll.c++
)
set(layout_src
layout/alignment.h++
layout/column.h++ layout/column.c++
layout/orientation.h++
layout/row.h++ layout/row.c++
)
set(native_window_src
native_window.h++ native_window.c++
native_window_imx.c++
native_window_linux.c++
native_window_macosx.c++
native_window_windows.c++
native_window/appkit.h++ native_window/appkit.c++
native_window/uikit.h++ native_window/uikit.c++
native_window/win32.h++ native_window/win32.c++
native_window/xcb.h++ native_window/xcb.c++
native_window/xlib.h++ native_window/xlib.c++
native_window/imx.h++ native_window/imx.c++
)
set(native_visual_src
native_visual.h++ native_visual.c++
native_visual/cgl.h++ native_visual/cgl.c++
native_visual/coregraphics.h++ native_visual/coregraphics.c++
native_visual/egl.h++ native_visual/egl.c++
native_visual/glx.h++ native_visual/glx.c++
native_visual/raster.h++ native_visual/raster.c++
native_visual/wgl.h++ native_visual/wgl.c++
native_visual/win32.h++ native_visual/win32.c++
native_visual/xcb.h++ native_visual/xcb.c++
native_visual/imx.h++ native_visual/imx.c++
)
注释xcb、x11代码
if(SKUI_USE_IMX8)
exclude_from_build(events/xcb.h++ events/xcb.c++
events_linux.c++
native_visual/glx.h++ native_visual/glx.c++
native_visual/xcb.h++ native_visual/xcb.c++
native_window/xcb.h++ native_window/xcb.c++
native_window/xlib.h++ native_window/xlib.c++
native_window_linux.c++
window_linux.c++)
else()
exclude_from_build(events/xcb.h++ events/imx.c++
events_imx.c++
native_visual/imx.h++ native_visual/imx.c++
native_window/imx.h++ native_window/imx.c++
native_window_imx.c++
window_imx.c++)
if (XCB_FOUND)
target_link_libraries(gui PUBLIC XCB::XCB XCB::AUX XCB::IMAGE)
else ()
exclude_from_build(events/xcb.h++ events/xcb.c++
native_window/xcb.h++ native_window/xcb.c++
native_visual/xcb.h++ native_visual/xcb.c++)
endif ()
if (GLX_FOUND)
target_link_libraries(gui PUBLIC GLX)
else ()
exclude_from_build(native_visual/glx.h++ native_visual/glx.c++)
endif ()
if (EGL_FOUND)
target_link_libraries(gui PUBLIC EGL::EGL)
else ()
exclude_from_build(native_visual/egl.h++ native_visual/egl.c++)
endif ()
if (X11_FOUND AND X11_XCB_FOUND)
target_link_libraries(gui PUBLIC ${X11_LIBRARIES} X11::XCB)
else ()
exclude_from_build(native_window/xlib.h++ native_window/xlib.c++)
endif ()
endif()