We have a nice tool on linux that most people don't use it (myself included) and can do the job of dealing with dependencies like a charm ! This tool is called AUTOTOOLS, yes, that one which create the pratical and easy ./configure ./make and ./make install system. Below I will demonstrate how we can use that to solve our issue:
STEP#1 - YOCTO BUILD CHANGES
We now need to add the kernel-dev to our local.conf (in build/conf) file and it will look like:
BB_NUMBER_THREADS ?= "${@oe.utils.cpu_count()}"
PARALLEL_MAKE ?= "-j ${@oe.utils.cpu_count()}"
MACHINE ??= 'imx6qsabresd'
DISTRO ?= 'poky'
PACKAGE_CLASSES ?= "package_rpm"
EXTRA_IMAGE_FEATURES = "debug-tweaks"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS = "\
STOPTASKS,${TMPDIR},1G,100K \
STOPTASKS,${DL_DIR},1G,100K \
STOPTASKS,${SSTATE_DIR},1G,100K \
ABORT,${TMPDIR},100M,1K \
ABORT,${DL_DIR},100M,1K \
ABORT,${SSTATE_DIR},100M,1K"
PACKAGECONFIG_pn-qemu-native = "sdl"
ASSUME_PROVIDED += "libsdl-native"
CONF_VERSION = "1"
BB_NUMBER_THREADS = '4'
PARALLEL_MAKE = '-j 4'
DL_DIR ?= "${BSPDIR}/downloads/"
ACCEPT_FSL_EULA = ""
DISTRO_FEATURES_remove = "x11 wayland"
CORE_IMAGE_EXTRA_INSTALL += "gpu-viv-bin-mx6q gpu-viv-bin-mx6q-dev kernel-dev"
STEP #2 - REBUILDING YOCTO
$ bitbake core-image-base
STEP#3 - POSSIBLE ISSUE
if the mxcfb.h file doens't appear in your sysroot (/opt/poky/1.6.1/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/) then you need to build your toolchain and then reinstall it as well:
rebuild with -c populate:
$ cd /fsl-community-bsp/build/tmp/deploy/sdk
$ ./poky-eglibc-x86_64-core-image-base-cortexa9hf-vfp-neon-toolchain-1.6.1.sh
STEP #4 - MODIFYING THE APP TO SUPPORT AUTOTOOLS
Now is the interesting part, we will need 2 different files (pretty simple ones actually), they are: Makefile.am and configure.ac.
Based on my projects configuration, I like to have bin, include and src folders, so the sample below will be on those:
Project Tree:
Project folder
|
a) ----- Makefile.am
|
b) ----- configure.ac
|
----- bin /
|
----- src /
| |
c) | ------ Makefile.am
| |
| ------ camera_test.c
| |
| ------ v4l_wrapper.c
|
----- include /
|
------ v4l_wrapper.h
a) Makefile.am
AUTOMAKE_OPTIONS = foreign
SUBDIRS = src # add just those ones that will have a Makefile inside.
b) configure.ac
AC_INIT([camera_test], [0.1], [andre.silva@freescale.com])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CHECK_HEADERS([fcntl.h stdint.h stdlib.h string.h sys/ioctl.h unistd.h])
# Checks for library functions.
AC_FUNC_MMAP
AC_CHECK_FUNCS([gettimeofday memset munmap])
##########################################################################
# Checks for programs needed for tests
##########################################################################
AC_CONFIG_FILES([Makefile
src/Makefile])
AC_OUTPUT
c) Makefile.am
bin_PROGRAMS = camera_test
camera_test_SOURCES = camera_test.c ../include/v4l_wrapper.h
nodist_camera_test_SOURCES = ../src/v4l_wrapper.c
ROOTFS_DIR = $(SDKTARGETSYSROOT)
TARGET_PATH_LIB = $(ROOTFS_DIR)/usr/lib
TARGET_PATH_INCLUDE = $(ROOTFS_DIR)/usr/include
AM_CPPFLAGS = -I $(prefix)/usr/src/kernel/include/uapi -I $(prefix)/usr/src/kernel/include/ -I $(TARGET_PATH_INCLUDE) -I ../include
AM_LDFLAGS = -Wl,--library-path=$(TARGET_PATH_LIB),-rpath-link=$(TARGET_PATH_LIB) -lm -L $(prefix)/usr/lib
# workaround to get the binaries copied to local /bin folder
all:
mv ../src/$(bin_PROGRAMS) ../bin
clean-local:
rm -rf ../bin/*
rm -rf ../src/*.o
* if you are not going to use any additional source you can only let the camera_test_SOURCES = camera_test.c
STEP #5 - GENERATING THE BUILD FILES
STEP #6 - BUILDING THE APPLICATION
For building any application using yocto (unless you have a recipe for it), you have to export the toolchain environment variables, and once it is done, the terminal you have used is now dirty and if you want to do all the steps above again, you will need another one (cleaned).
$ cd /opt/poky/1.6.1/
$ . ./environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi
$ cd /home/usr/v4l_wrapper_yocto/
$ ./configure --host=arm-poky-linux-gnueabi --prefix=$SDKTARGETSYSROOT
$ make
At this point you will have your binary placed in bin/ folder, if you enter the make install command it will install (copy) the application binary into your rootfs/bin, where the rootfs is defined by the --ṕrefix in ./configure line.
THE RESULT
PARALLEL_MAKE ?= "-j ${@oe.utils.cpu_count()}"
MACHINE ??= 'imx6qsabresd'
DISTRO ?= 'poky'
PACKAGE_CLASSES ?= "package_rpm"
EXTRA_IMAGE_FEATURES = "debug-tweaks"
USER_CLASSES ?= "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"
BB_DISKMON_DIRS = "\
STOPTASKS,${TMPDIR},1G,100K \
STOPTASKS,${DL_DIR},1G,100K \
STOPTASKS,${SSTATE_DIR},1G,100K \
ABORT,${TMPDIR},100M,1K \
ABORT,${DL_DIR},100M,1K \
ABORT,${SSTATE_DIR},100M,1K"
PACKAGECONFIG_pn-qemu-native = "sdl"
ASSUME_PROVIDED += "libsdl-native"
CONF_VERSION = "1"
BB_NUMBER_THREADS = '4'
PARALLEL_MAKE = '-j 4'
DL_DIR ?= "${BSPDIR}/downloads/"
ACCEPT_FSL_EULA = ""
DISTRO_FEATURES_remove = "x11 wayland"
CORE_IMAGE_EXTRA_INSTALL += "gpu-viv-bin-mx6q gpu-viv-bin-mx6q-dev kernel-dev"
STEP #2 - REBUILDING YOCTO
$ bitbake core-image-base
STEP#3 - POSSIBLE ISSUE
if the mxcfb.h file doens't appear in your sysroot (/opt/poky/1.6.1/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi/) then you need to build your toolchain and then reinstall it as well:
rebuild with -c populate:
$ cd fsl-community-bsp/build
$ bitbake core-image-base -c populate_sdk
and then install:
$ ./poky-eglibc-x86_64-core-image-base-cortexa9hf-vfp-neon-toolchain-1.6.1.sh
Now is the interesting part, we will need 2 different files (pretty simple ones actually), they are: Makefile.am and configure.ac.
Based on my projects configuration, I like to have bin, include and src folders, so the sample below will be on those:
Project Tree:
Project folder
|
a) ----- Makefile.am
|
b) ----- configure.ac
|
----- bin /
|
----- src /
| |
c) | ------ Makefile.am
| |
| ------ camera_test.c
| |
| ------ v4l_wrapper.c
|
----- include /
|
------ v4l_wrapper.h
AUTOMAKE_OPTIONS = foreign
SUBDIRS = src # add just those ones that will have a Makefile inside.
b) configure.ac
AC_INIT([camera_test], [0.1], [andre.silva@freescale.com])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CHECK_HEADERS([fcntl.h stdint.h stdlib.h string.h sys/ioctl.h unistd.h])
# Checks for library functions.
AC_FUNC_MMAP
AC_CHECK_FUNCS([gettimeofday memset munmap])
##########################################################################
# Checks for programs needed for tests
##########################################################################
AC_CONFIG_FILES([Makefile
src/Makefile])
AC_OUTPUT
c) Makefile.am
bin_PROGRAMS = camera_test
camera_test_SOURCES = camera_test.c ../include/v4l_wrapper.h
nodist_camera_test_SOURCES = ../src/v4l_wrapper.c
ROOTFS_DIR = $(SDKTARGETSYSROOT)
TARGET_PATH_LIB = $(ROOTFS_DIR)/usr/lib
TARGET_PATH_INCLUDE = $(ROOTFS_DIR)/usr/include
AM_CPPFLAGS = -I $(prefix)/usr/src/kernel/include/uapi -I $(prefix)/usr/src/kernel/include/ -I $(TARGET_PATH_INCLUDE) -I ../include
AM_LDFLAGS = -Wl,--library-path=$(TARGET_PATH_LIB),-rpath-link=$(TARGET_PATH_LIB) -lm -L $(prefix)/usr/lib
# workaround to get the binaries copied to local /bin folder
all:
mv ../src/$(bin_PROGRAMS) ../bin
clean-local:
rm -rf ../bin/*
rm -rf ../src/*.o
* if you are not going to use any additional source you can only let the camera_test_SOURCES = camera_test.c
STEP #5 - GENERATING THE BUILD FILES
In a clean terminal enter the following commands to generate the files:
$ autoheader
$ autoreconf --install
it will create all the necessary files to build your application, including dealing with dependencies, even if they are from kernel.
STEP #6 - BUILDING THE APPLICATION
For building any application using yocto (unless you have a recipe for it), you have to export the toolchain environment variables, and once it is done, the terminal you have used is now dirty and if you want to do all the steps above again, you will need another one (cleaned).
$ cd /opt/poky/1.6.1/
$ . ./environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi
$ cd /home/usr/v4l_wrapper_yocto/
$ ./configure --host=arm-poky-linux-gnueabi --prefix=$SDKTARGETSYSROOT
$ make
At this point you will have your binary placed in bin/ folder, if you enter the make install command it will install (copy) the application binary into your rootfs/bin, where the rootfs is defined by the --ṕrefix in ./configure line.
THE RESULT
The sample code can be found here.
Thanks to Rogério Pimentel who helped me with the autotools and how to solve the mxcfb.h dependency issue and Daiane Angolini with YOCTO.
EOF !