lv_port_linux
lv_port_linux copied to clipboard
Documentation : cross compilation for arm
First of all great project, I'm quite new to the embedded graphics stack and this project compiles and works out of the box on my laptop so that's great and very promising.
Any chances of giving some indications on how to cross compile this for an arm device ?
My use case is the following : I want to try it out on an ereader that only has framebuffer : https://linux-sunxi.org/Bookeen_Cybook_Muse ... right now I can compile https://github.com/allepet/nolim-ebook-sdk for it but am not sure I can build upon that and would rather have a framework such as LVGL to build upon.
cmake newbie, I tried adding :
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabi-g++)
to CMakeLists.txt, but that fails in a loop :
You have changed variables that require your cache to be deleted.
Configure will be re-run and you may have to reset some variables.
The following variables have changed:
CMAKE_C_COMPILER= /usr/bin/cc
CMAKE_CXX_COMPILER= /usr/bin/c++
Happy that you like LVGL so far.
I'm not a CMake expert either, but found that these help:
- Adding the compiler ID like this
set(CMAKE_C_COMPILER arm-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabi-g++)
set(CMAKE_C_COMPILER_ID GNU) #Add these
set(CMAKE_CXX_COMPILER_ID GNU)
- Comment out this line: https://github.com/lvgl/lvgl/blob/master/CMakeLists.txt#L6
Seemingly the problem is that the nested CMake files are resetting the CMAKE_C/CXX_COMPILER variables resulting in infinite reconfiguration.
After these changes it still doesn't compile for me, but I hope it's only due to my hacky cross compile environment.
@kisvegabor thanks for taking a look at this ! It seems to work :
make
[snip]
[ 99%] Linking C static library liblvgl_examples.a
[ 99%] Built target lvgl_examples
[ 99%] Building C object CMakeFiles/main.dir/main.c.o
[ 99%] Building C object CMakeFiles/main.dir/mouse_cursor_icon.c.o
[100%] Linking CXX executable /home/arthur/local/lv_port_linux_frame_buffer/bin/main
[100%] Built target main
❯ file ../bin/main
../bin/main: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, BuildID[sha1]=655f609c2e15c6a3e9329a5c1bc4e14837d93394, for GNU/Linux 3.2.0, not stripped
Unfortunately I have to wait a week to try it out on the target machine which I don't have at hand.
Got round to testing it on the device, but it fails to run since it is dynamically linked to a libc6 version that is not the target device :
# ./lvgl_framebuffer
./lvgl_framebuffer: /lib/libc.so.6: version `GLIBC_2.38' not found (required by ./lvgl_framebuffer)
./lvgl_framebuffer: /lib/libc.so.6: version `GLIBC_2.32' not found (required by ./lvgl_framebuffer)
./lvgl_framebuffer: /lib/libc.so.6: version `GLIBC_2.34' not found (required by ./lvgl_framebuffer)
./lvgl_framebuffer: /lib/libm.so.6: version `GLIBC_2.29' not found (required by ./lvgl_framebuffer)
./lvgl_framebuffer: /lib/libm.so.6: version `GLIBC_2.27' not found (required by ./lvgl_framebuffer)
./lvgl_framebuffer: /lib/libm.so.6: version `GLIBC_2.38' not found (required by ./lvgl_framebuffer)
./lvgl_framebuffer: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by ./lvgl_framebuffer)
./lvgl_framebuffer: /usr/lib/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./lvgl_framebuffer)
./lvgl_framebuffer: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./lvgl_framebuffer)
I now have to see if I can figure out static linking, using musl or linking to the older libc6 that is present on the system :
# /lib/libc.so.6
GNU C Library (Sourcery G++ Lite 2010.09-50) stable release version 2.11.1, by Roland McGrath et al.
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.5.1.
Compiled on a Linux >>2.6.24-26-server<< system on 2010-11-07.
Available extensions:
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
Native POSIX Threads Library by Ulrich Drepper et al
Support for some architectures added on, not maintained in glibc core.
BIND-8.2.3-T5B
For bug reporting instructions, please see:
<https://support.codesourcery.com/GNUToolchain/>.
any pointers welcome !
cc @xuneo @liamHowatt @HanesSciarrone Do you have any idea for this?
I'm not sure of how to fix it, but seems you need to tell CMAKE where's the SYSROOT. You can copy out the rootfs from board.
See https://stackoverflow.com/questions/73591889/cross-compiling-with-cmake-picking-up-host-rather-than-target-definitions
If any more issues, I would search for how to cross compile for raspberry-pi. It should give lots of guides.
Hi @arthurlutz, I hope you are ok.
I can't say exactly what could be the reason for this error, but maybe the problem could be the GLIBC version mismatch between target and host (build machine). Could you run the ldd --version command on target and host to compare the GLIBC used?
@arthurlutz I think the version of libc that the binary tries to link may be based on the version of the toolchain it was compiled with. I'm not sure how old the Linux on your e-reader is but it may be from the Linux 3.0 that the wiki links. It says to use toolchain version 4.9.4 for v3.4 kernels. I struggled to navigate that Linaro artifact file server but this SO answer has the link to a 4.9.3 toolchain :P
Try compiling your LVGL test with a 4.* version of arm-linux-gnueabihf-gcc and see if it's happy with the libc currently on your e-reader.
@HanesSciarrone I am well thank you for asking. Hope you are well too.
Ideed I am trying to cross-compile with a different libc6 on the target system :
on the build :
❯ /usr/lib/x86_64-linux-gnu/libc.so.6 -v
GNU C Library (Ubuntu GLIBC 2.39-0ubuntu2) stable release version 2.39.
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 13.2.0.
libc ABIs: UNIQUE IFUNC ABSOLUTE
Minimum supported kernel: 3.2.0
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.
❯ ldd --version
ldd (Ubuntu GLIBC 2.39-0ubuntu2) 2.39
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
on the target :
# ldd --version
-sh: ldd: not found
# /lib/libc.so.6 --version
GNU C Library (Sourcery G++ Lite 2010.09-50) stable release version 2.11.1, by Roland McGrath et al.
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.5.1.
Compiled on a Linux >>2.6.24-26-server<< system on 2010-11-07.
Available extensions:
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
Native POSIX Threads Library by Ulrich Drepper et al
Support for some architectures added on, not maintained in glibc core.
BIND-8.2.3-T5B
For bug reporting instructions, please see:
<https://support.codesourcery.com/GNUToolchain/>.
@liamHowatt great tips, thanks so much for looking into this!
Unfortunately I can get it to compile :
❯ make -j
[ 1%] Building CXX object lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgAnimation.cpp.o
[ 1%] Building CXX object lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgBezier.cpp.o
[ 1%] Building CXX object lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgCapi.cpp.o
[ 1%] Building CXX object lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgCompressor.cpp.o
[ 1%] Building CXX object lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgInitializer.cpp.o
[ 1%] Building CXX object lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgFill.cpp.o
arm-linux-gnueabihf-g++: error: unrecognized command line option '-std=gnu++17'
arm-linux-gnueabihf-g++: error: unrecognized command line option '-std=gnu++17'
arm-linux-gnueabihf-g++: error: unrecognized command line option '-std=gnu++17'
[ 1%] Building CXX object lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgCanvas.cpp.o
make[2]: *** [lvgl/CMakeFiles/lvgl_thorvg.dir/build.make:76: lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgAnimation.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: *** [lvgl/CMakeFiles/lvgl_thorvg.dir/build.make:90: lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgBezier.cpp.o] Error 1
make[2]: *** [lvgl/CMakeFiles/lvgl_thorvg.dir/build.make:118: lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgCapi.cpp.o] Error 1
arm-linux-gnueabihf-g++: error: unrecognized command line option '-std=gnu++17'
arm-linux-gnueabihf-g++: error: unrecognized command line option '-std=gnu++17'
[ 2%] Building CXX object lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgLoader.cpp.o
arm-linux-gnueabihf-g++: error: unrecognized command line option '-std=gnu++17'
[ 2%] Building CXX object lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgMath.cpp.o
[ 2%] Building CXX object lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgPicture.cpp.o
[ 2%] Building CXX object lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgPaint.cpp.o
arm-linux-gnueabihf-g++: error: unrecognized command line option '-std=gnu++17'
make[2]: *** [lvgl/CMakeFiles/lvgl_thorvg.dir/build.make:132: lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgCompressor.cpp.o] Error 1
make[2]: *** [lvgl/CMakeFiles/lvgl_thorvg.dir/build.make:146: lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgFill.cpp.o] Error 1
arm-linux-gnueabihf-g++: error: unrecognized command line option '-std=gnu++17'
make[2]: *** [lvgl/CMakeFiles/lvgl_thorvg.dir/build.make:160: lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgInitializer.cpp.o] Error 1
make[2]: *** [lvgl/CMakeFiles/lvgl_thorvg.dir/build.make:104: lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgCanvas.cpp.o] Error 1
make[2]: *** [lvgl/CMakeFiles/lvgl_thorvg.dir/build.make:174: lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgLoader.cpp.o] Error 1
arm-linux-gnueabihf-g++: error: unrecognized command line option '-std=gnu++17'
make[2]: *** [lvgl/CMakeFiles/lvgl_thorvg.dir/build.make:188: lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgMath.cpp.o] Error 1
arm-linux-gnueabihf-g++: error: unrecognized command line option '-std=gnu++17'
make[2]: *** [lvgl/CMakeFiles/lvgl_thorvg.dir/build.make:216: lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgPicture.cpp.o] Error 1
arm-linux-gnueabihf-g++: error: unrecognized command line option '-std=gnu++17'
make[2]: *** [lvgl/CMakeFiles/lvgl_thorvg.dir/build.make:202: lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgPaint.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:188: lvgl/CMakeFiles/lvgl_thorvg.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 46%] Built target lvgl
make: *** [Makefile:136: all] Error 2
would you have an idea on what I need to change to fix this ? Maybe I can test out the binary produced by your compilation ?
@arthurlutz
C++17 didn't exist when that compiler was released so it doesn't support the flag -std=gnu++17. If you're not using thorvg then you can just not compile it in your CMakeLists.txt.
Remove lvgl::thorvg from this line.
https://github.com/lvgl/lv_port_linux_frame_buffer/blob/dccc6a1ca48372aa993dbea7a8e17dec6f42df6a/CMakeLists.txt#L15
And then also change this 1 to a 0.
https://github.com/lvgl/lv_port_linux_frame_buffer/blob/dccc6a1ca48372aa993dbea7a8e17dec6f42df6a/lv_conf.h#L696
By doing these things and using yours and kisvegabor's tweaks I was able to get it to compile with the v4 toolchain. Sorry, I hadn't tried to actually compile it until now :P
Fingers crossed the glibc versions match! 🤞️
I think XuNeo's suggestion was a good idea if this fails to execute again.
Hi @arthurlutz, thanks for the wish.
The command output you ran confirms that the problem is the GLIBC used in the toolchain between the Build system and the target so, the issue is here.
The chance of fixing the problem with the liamHowatt suggestion is quite high. But, if it doesn't work you need to download the version of the toolchain used in the target, this information is here:
/lib/libc.so.6 --version
GNU C Library (Sourcery G++ Lite 2010.09-50) stable release version 2.11.1, by Roland McGrath et al.
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.5.1.
Compiled on a Linux >>2.6.24-26-server<< system on 2010-11-07.
Available extensions:
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
Native POSIX Threads Library by Ulrich Drepper et al
Support for some architectures added on, not maintained in glibc core.
BIND-8.2.3-T5B
For bug reporting instructions, please see:
<https://support.codesourcery.com/GNUToolchain/>.
The toolchain version is GNU CC version 4.5.1. About the sysroot in general the toolchain comes with it. I would like to suggest you @arthurlutz that instead of installing the toolchain on your build system you untzip the Linaro tar in some folder and modify the CMake toolchain file to point to the folder.
I'll try to find toolchain version 4.5.1 while testing @liamHowatt 's solution. Please @arthurlutz, let us know if the solution works.
Hi thanks a lot again for being so thorough with helping me out with this.
The changes suggested don't seem to remove all thorvg from the make files, I still get the same errors, here is my diff :
❯ git diff
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d91b196..a1a89ab 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,13 @@
cmake_minimum_required(VERSION 3.10)
project(lvgl)
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_PROCESSOR arm)
+set(CMAKE_C_COMPILER /home/arthur/local/gcc-linaro-4.9-2015.02-3-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc)
+set(CMAKE_CXX_COMPILER /home/arthur/local/gcc-linaro-4.9-2015.02-3-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++)
+
+
+
set(CMAKE_C_STANDARD 99)#C99 # lvgl officially support C99 and above
set(CMAKE_CXX_STANDARD 17)#C17
set(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -12,6 +19,6 @@ target_include_directories(lvgl PUBLIC ${PROJECT_SOURCE_DIR})
add_executable(main main.c mouse_cursor_icon.c)
-target_link_libraries(main lvgl lvgl::examples lvgl::demos lvgl::thorvg ${SDL2_LIBRARIES} m pthread)
+target_link_libraries(main lvgl lvgl::examples lvgl::demos ${SDL2_LIBRARIES} m pthread)
add_custom_target (run COMMAND ${EXECUTABLE_OUTPUT_PATH}/main DEPENDS main)
diff --git a/lv_conf.h b/lv_conf.h
index 822b2a3..2e93e4e 100644
--- a/lv_conf.h
+++ b/lv_conf.h
@@ -693,7 +693,7 @@
#define LV_USE_VECTOR_GRAPHIC 1
/* Enable ThorVG (vector graphics library) from the src/libs folder */
-#define LV_USE_THORVG_INTERNAL 1
+#define LV_USE_THORVG_INTERNAL 0
/* Enable ThorVG by assuming that its installed and linked to the project */
#define LV_USE_THORVG_EXTERNAL 0
diff --git a/lvgl b/lvgl
--- a/lvgl
+++ b/lvgl
@@ -1 +1 @@
-Subproject commit 5c9a0cc017dd23b2103dbc6b88fb155193020187
+Subproject commit 5c9a0cc017dd23b2103dbc6b88fb155193020187-dirty
(I can push a fork if that's easier to follow/review)
in build :
❯ rgrep thorvg *
[snip]
lvgl/CMakeFiles/lvgl_thorvg.dir/DependInfo.cmake: "/home/arthur/local/lv_port_linux_frame_buffer/lvgl/src/libs/thorvg/tvgXmlParser.cpp" "lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgXmlParser.cpp.o" "gcc" "lvgl/CMakeFiles/lvgl_thorvg.dir/src/libs/thorvg/tvgXmlParser.cpp.o.d"
lvgl/CMakeFiles/lvgl_thorvg.dir/DependInfo.cmake: "/home/arthur/local/lv_port_linux_frame_buffer/lvgl/src/others/vg_lite_tvg/vg_lite_tvg.cpp" "lvgl/CMakeFiles/lvgl_thorvg.dir/src/others/vg_lite_tvg/vg_lite_tvg.cpp.o" "gcc" "lvgl/CMakeFiles/lvgl_thorvg.dir/src/others/vg_lite_tvg/vg_lite_tvg.cpp.o.d"
Makefile:# Target rules for targets named lvgl_thorvg
Makefile:lvgl_thorvg: cmake_check_build_system
Makefile: $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 lvgl_thorvg
Makefile:.PHONY : lvgl_thorvg
Makefile:lvgl_thorvg/fast:
Makefile: $(MAKE) $(MAKESILENT) -f lvgl/CMakeFiles/lvgl_thorvg.dir/build.make lvgl/CMakeFiles/lvgl_thorvg.dir/build
Makefile:.PHONY : lvgl_thorvg/fast
Makefile: @echo "... lvgl_thorvg"
❯ rgrep thorvg * | wc -l
1241
The changes suggested don't seem to remove all thorvg from the make files, I still get the same errors, here is my diff :
Looks like you need LV_CONF_BUILD_DISABLE_THORVG_INTERNAL to completely remove it from CMake. Changing macros to 0 only disables the file content.
https://github.com/lvgl/lvgl/blob/master/env_support/cmake/custom.cmake#L47-L52
Interesting, in which file do I have to insert that ?
It should be passed in from cmake.
cmake -Bbuild -GNinja -DLV_CONF_BUILD_DISABLE_THORVG_INTERNAL=1 This is what I used.
My build worked without that flag because I ran make main instead of make so that only the dependencies of the executable "main" would be built. My bad.
@liamHowatt that works ! I get to compile a main binary. But... I can't execute it :
# mv main lvgl
# file ./lvgl
./lvgl: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
# ./lvgl
-sh: ./lvgl: not found
# ./lvgl --verbose
-sh: ./lvgl: not found
# ./lvgl --debug
-sh: ./lvgl: not found
Do you know how I can debug this ?
@XuNeo thanks for the suggestion but that didn't filter out thorvg. But I learned that I can compile it with ninja instead of make... that's interesting.
You may try chmod +x lvgl firstly.
Tried that, it didn't change the output.
Hi @arthurlutz, I hope you are ok,
Could you share with us the output of the ls -al command where you have the binary file on your build systems? It's strange that the binary after compilation doesn't have execute permission.
# ls -alh lvgl
-rwxr-xr-x 1 root root 1.2M Jan 1 06:54 lvgl
# file lvgl
lvgl: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped
# md5sum lvgl
e45c3a4a1434f9620268bdd61a864f40 lvgl
# head lvgl
ELF(�
|||��PPPDDQ�td/lib/ld-linux-armhf.so.3GNUGNUN���3�u#)�]m�ەn��%*$ )'& "(
%
[snip]
The output appears to be from the SBC rather than the workstation. Is it possible? In any case, we can see that you have execution permissions. :confused:
Yes, the not found error is when running on the target system. Not on the build station.
Yes, I know that the not found error is when running on the target system. I was referring to the output of the ls -al command. :sweat_smile:
I can confirm the ls -al command was run on the target system.
@arthurlutz
I would like to try something. First of all I would like to know if you are using this Toolchain as cross-compiler: 4.9.4 linaro toolchain.
Also, I would like to ask you if you can share with us a link of your repository with the changes you made so far in a branch.
@arthurlutz
The shell on the target is missing some of the nice things that come with standard ".bashrc" configs. It seems that you cannot launch an executable without specifying the full path to the executable. I was able to reproduce the problem like so
liam@liam-Precision-3520:~$ ./a.out # executable runs fine
foobar
liam@liam-Precision-3520:~$ bash --norc # start a shell without configs -- similar to your target's shell.
bash-5.0$ ./foobar # "no such file or directory"
bash: ./foobar: No such file or directory # even though it should work.
bash-5.0$ $PWD/a.out # specify the full path to the
foobar # executable in this limited
bash-5.0$ # target shell.
Try running the executable like this:
$PWD/lvgl
@HanesSciarrone I can confirm I'm using that toolchain (at least I think I have configured it to use it, and the information from file seems to confirm that...)
@liamHowatt I thought of that too, and had tried the full path. Same result. I'm really curious as to where this not found is coming from. I'd love to launch it with strace but that's a tool that is not present. Tried switching to ash, same result. Tried to move to a different mount point, same result.